Pagina 1 di 1

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

Inviato: ven dic 18, 2020 10:24 am
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: