Jak podmienić wartość w GRID?

0

To mój pierwszy program w GTK+ i nie do końca rozumiem jak działa :D
Działać działa, ale sypie takimi błędami:

gtk_grid_attach: assertion '_gtk_widget_get_parent (child) == NULL' failed

Jak to poprawić? Brzydki kod, ostrzegam wrażliwych! :P

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <stdbool.h>

int *n;
int *tab;
gchar **values;
GtkWidget **label;
GtkWidget *table;

bool next_perm(int n, int p[]) {
    if(n==1) {
        return false;
    }
    int pozycja=0;
    for(int i=0; i<n; i++)
        if(p[i]==n) {
            pozycja=i;
            break;
        }
    if(pozycja<n-1) {
        int tymcz=p[pozycja];
        p[pozycja]=p[pozycja+1];
        p[pozycja+1]=tymcz;
        return true;
    }
    else {
        if(!next_perm(n-1, p)) {
            return false;
        }
        for(int i=n-1; i>0; i--) {
            p[i]=p[i-1];
        }
        p[0]=n;
        return true;
    }
}

void switchperm() {
    int b=*n;
    next_perm(b*b, tab);
    for(int i=0; i<b*b; i++) {
        values[i]=g_strdup_printf("%d", tab[i]);
    }
    int pos=0;
    for (int i=0; i<b; i++) {
        for (int j=0; j<b; j++) {
            gtk_label_set_text(GTK_LABEL(label[pos]), values[pos]);
            gtk_grid_attach(GTK_GRID(table), label[pos], j, i, 1, 1);
            pos++;
        }
    }
}

int main(int argc, char *argv[]) {
    int x=3;
    n=&x;
    GtkWidget *window;
    GtkWidget *tittle;
    GtkWidget *button;
    GtkWidget *box;
    
    tab=malloc(sizeof(int) * (x*x));
    values=malloc(sizeof(gchar*) * (x*x));
    label=malloc(sizeof(GtkWidget*) * (x*x));
    table=malloc(sizeof(GtkWidget) * (x*x));
    
    for(int i=0; i<x*x; i++) {
        tab[i]=(x*x)-i;
        values[i] = g_strdup_printf("%d", tab[i]);
    }
    
    gtk_init(&argc, &argv);
    
    window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_title(GTK_WINDOW(window), "Permutacje");
    
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    
    table = gtk_grid_new();
    gtk_grid_set_row_spacing(GTK_GRID(table), 15);
    gtk_grid_set_row_homogeneous(GTK_GRID(table), TRUE);
    gtk_grid_set_column_spacing(GTK_GRID(table), 15);
    gtk_grid_set_column_homogeneous(GTK_GRID(table), TRUE);

    int pos = 0;
    
    for (int i=0; i<x; i++) {
        for (int j=0; j<x; j++) {
            label[pos] = gtk_label_new(values[pos]);
            gtk_grid_attach(GTK_GRID(table), label[pos], j, i, 1, 1);
            pos++;
        }
    }
    
    button=gtk_button_new_with_label("Następna permutacja");
    g_signal_connect(button, "clicked", G_CALLBACK(switchperm), NULL);
    
    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), (gpointer)window);
    
    box=gtk_box_new(GTK_ORIENTATION_VERTICAL, 15);
    
    tittle=gtk_label_new("Generator permutacji");
    
    gtk_box_pack_start(GTK_BOX(box), tittle, 0, 0, 0);
    gtk_box_pack_start(GTK_BOX(box), table, 0, 0, 0);
    gtk_box_pack_start(GTK_BOX(box), button, 0, 0, 0);
    
    gtk_container_add(GTK_CONTAINER(window), box);
    gtk_widget_show_all(window);
    gtk_main();
    
    return 0;
}
0

Wywaliłem z funkcji "switchperm" linijkę

gtk_grid_attach(GTK_GRID(table), label[pos], j, i, 1, 1);

wydaje się, że teraz jest wszystko dobrze. Wcześniej myślałem, że ta linijka jest potrzebna żeby "zaktualizować" informacje :D

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