[C][GTK3] Il codice funziona solo se uso l'opzione -O1

"Null reference exception"? no, grazie, prendo un "unexpected T_VARIABLE"... Questo è il forum per imparare l'arte della programmazione o per chiedere un parere su una sessione di debug particolarmente ostica.
Regole del forum
Ricorda di indicare chiaramente nell'oggetto il linguaggio ([C#] oppure [PHP], [Java], [HTML], ...), se la discussione ne riguarda uno in particolare!
Rispondi
Avatar utente
maurotramonti
Livello: DVD-ROM (5/15)
Livello: DVD-ROM (5/15)
Messaggi: 190
Iscritto il: mar mag 01, 2018 3:28 pm
Località: Alessandria

[C][GTK3] Il codice funziona solo se uso l'opzione -O1

Messaggio da maurotramonti »

Salve,
vorrei sottoporvi questo problema. Ho da poco iniziato ad apprendere il funzionamento della libreria grafica Gtk+3 sotto C e stavo scrivendo una piccola calcolatrice per esercitarmi. Non ho ancora completato il codice ma ho incontrato uno strano problema: compilando il file con la seguente istruzione:

Codice: Seleziona tutto

gcc  `pkg-config --cflags gtk+-3.0` -o mcalc mcalc.c `pkg-config --libs gtk+-3.0`
eseguendolo ottengo un Segfault, mentre aggiungendo il flag -O2 che ottimizza il codice, funziona tutto regolarmente. Vi posto il frammento di codice che ho localizzato come fonte del problema:

Codice: Seleziona tutto


static bool just_exec = true;
static char last_ch[2];

/* Callback */

static gboolean num_button_callback(gpointer data, GtkButton *widget) {
  char tmp_string[64];
  if (just_exec) {
    if (!strcmp(gtk_button_get_label(widget), "0")) return TRUE;
    else {
      gtk_entry_set_text(GTK_ENTRY (data), gtk_button_get_label(widget));
      strcpy(last_ch, gtk_button_get_label(widget));
      just_exec = false;
      return TRUE;
    }
  }

...

  for (int i, row = 0; i < 10; i++) {
    if ((i % 3) == 0) row = i / 3;
    sprintf(button_lbl, "%d", ((i - 1) + 10) - (i * 2));
    buttons[i] = gtk_button_new_with_label(button_lbl);
    g_signal_connect_swapped(buttons[i], "clicked", G_CALLBACK (num_button_callback), numbers_string); // <-- questa è la riga problematica
    gtk_grid_attach(GTK_GRID (grid), buttons[i], i - row * 3, row + 2, 1, 1);

  }
In pratica nel ciclo che ho postato riempio un array di GtkWidget chiamato *buttons con i bottoni da 0 a 9, li visualizo nella griglia e gli connetto la callback postata sopra. Davvero non capisco cosa ci sia che non va, durante la compilazione non mi dà né warnings né niente, poi durante l'esecuzione ricevo nel terminale:

Codice: Seleziona tutto

(mcalc:7903): GLib-GObject-WARNING **: 22:01:13.106: invalid (NULL) pointer instance

(mcalc:7903): GLib-GObject-CRITICAL **: 22:01:13.106: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed

(mcalc:7903): GLib-GObject-WARNING **: 22:01:13.106: invalid (NULL) pointer instance

(mcalc:7903): GLib-GObject-CRITICAL **: 22:01:13.106: g_signal_connect_data: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed
Errore di segmentazione (core dump creato)

:muro: :muro: :muro:

Ringrazio in anticipo chi si offrirà di aiutarmi :ciao:
Computer: Intel Pentium Gold 2.30 GHz - 8 GB RAM - 120 GB SSD - Windows 10 Home + Ubuntu 20.10
App Android di Turbolab! https://bit.ly/3eqWUPO
GitHub: https://github.com/maurotramonti

Rispondi
  • Argomenti simili
    Risposte
    Visite
    Ultimo messaggio