GTK3 C nieoczekiwany segmentation fault

0

Co niepoprawnie robię próbując przekazać tablicę przez gpointer?
W debuggerze dostaję segmentational fault, a gtk wypluwa w konsoli:

(GTK.exe:47484): GLib-GObject-WARNING **: invalid uninstantiatable type `<unknown>' in cast to `Gtk
Label'

(GTK.exe:47484): Gtk-CRITICAL **: gtk_label_get_text: assertion `GTK_IS_LABEL (label)' failed

Kod programu:

 int n;

static void test(gpointer t){
	GtkWidget **label = t;
	int perm[n*n];
	for(int i = 0;i<n*n;i++){
		printf("t\n");
		perm[i]=atoi(gtk_label_get_text(GTK_LABEL(label[i])));
		printf("%d %d\n",i,perm[i]);
	}
}
 int main(int argc, char *argv[]) {
	n = 4;
	char c[n];
	GtkWidget *buttons[n * n];

	[...]

	GtkWidget *b = gtk_button_new_with_label("Next");
	gtk_grid_attach(GTK_GRID(menu), b, 20, 10, 10, 10);

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			sprintf(c, "%d", i * n + j + 1);
			buttons[i * n + j] = gtk_label_new(c);
			gtk_grid_attach(GTK_GRID(grid), buttons[i * n + j], 10 * j, i * 10,
					10, 10);
		}
	}
	g_signal_connect(G_OBJECT(b), "clicked", G_CALLBACK(test), &buttons);
	[...]
	return 0;
}
0

A skąd wiesz, że jest niepoprawnie? Jakieś błędy wyskakują? Odpal debugger i zobacz co się dzieje.

0

Nie podałeś całego kodu, więc ciężko wnisokować. Patrząc na swoją dawną aplikację to robiłem coś takiego:

             str_dane_info *status = new str_dane_info;
            status->wid1 = status_bar;
            status->wid2 = textview;
            status->wid3 = textview_blue;
            status->wid4 = progres_bar;
            status->model = model;
            status->tree_view = zakladki;
            g_signal_connect(G_OBJECT(but_con),"clicked",G_CALLBACK(connect_uart),(gpointer)status);
...
void Okno::connect_uart(GtkWidget *widget,gpointer data){
   ...
        str_dane_info *tmp = (str_dane_info *)data;
...

Tyle że tutaj jest struktura ;).
Tak poza tematem:
Warto w takiej sytuacji skorzystać z inteligentnych wskaźników do struktury. Tutaj jest z newem, bo trzeba było zrobić czyściciela pamięci do GTK(warto o tym pamiętać) i wrzuciłem zwyczajnie wszystko do jednego worka.

0

Błąd był dość zabawny, w nagłówku funkcji test brakowało :

 GtkWidget *widget

1 użytkowników online, w tym zalogowanych: 0, gości: 1