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;
}