dml
14-10-2013, 09:07
Hi,
ich habe einmal wieder ein kleineres Problem bei Gtk. Und zwar benötige ich in der G_Callback Funktion die Elementnummer eines malloc Array`s. Mein Problem ist der gpointer von g_signal_connect. Bei dem Gui-Aufruf wurde die Schleife schon komplett durchlaufen und somit wird bei jedem Knopfdruck die letzte Zahl der Schleife also i=4 übertragen und ein Speicherleck verursacht.
Version 1:
void c_clicked(GtkButton *button, gpointer user_data){
int *i = user_data;
printf(*i=%i\n",*i);
...
extern int *Ary;
printf(Ary[*i]=%i\n",Ary[*i]);
}
int main(){
...
GtkWidget c_button[4];
for(int i=0,i<4, i++){
c_button[i] = gtk_button_new_with_label ("text");
g_signal_connect (c_button[i], "clicked", G_CALLBACK (b_clicked), &i);
}
return 0;
}
Version 2:
typedef struct{
int id;
int *Ary; // ->malloc
} Data;
void c_clicked(GtkButton *button, gpointer user_data){
Data *data = user_data;
printf(%i\n",data->Ary[data->id]);
}
void my_func( int anz, int *array){
...
Data data[anz];
GtkWidget c_button[anz];
for(int i=0,i<=anz, i++){
data[i].id= i;
data[i].Ary = array;
c_button[i] = gtk_button_new_with_label ("text");
g_signal_connect (c_button[i], "clicked", G_CALLBACK (b_clicked), &data[i]);
}
return 0;
}
Habe es jetzt direkt mit der Addresse des Arrayementes versucht also:
g_signal_connect (c_button[i], "clicked", G_CALLBACK (b_clicked), &array[i]);
und funktioniert, doch bringt Problem der konstanten Adresse mit sich.
Vielen Dank für Eure Unterstützung!
dml
ich habe einmal wieder ein kleineres Problem bei Gtk. Und zwar benötige ich in der G_Callback Funktion die Elementnummer eines malloc Array`s. Mein Problem ist der gpointer von g_signal_connect. Bei dem Gui-Aufruf wurde die Schleife schon komplett durchlaufen und somit wird bei jedem Knopfdruck die letzte Zahl der Schleife also i=4 übertragen und ein Speicherleck verursacht.
Version 1:
void c_clicked(GtkButton *button, gpointer user_data){
int *i = user_data;
printf(*i=%i\n",*i);
...
extern int *Ary;
printf(Ary[*i]=%i\n",Ary[*i]);
}
int main(){
...
GtkWidget c_button[4];
for(int i=0,i<4, i++){
c_button[i] = gtk_button_new_with_label ("text");
g_signal_connect (c_button[i], "clicked", G_CALLBACK (b_clicked), &i);
}
return 0;
}
Version 2:
typedef struct{
int id;
int *Ary; // ->malloc
} Data;
void c_clicked(GtkButton *button, gpointer user_data){
Data *data = user_data;
printf(%i\n",data->Ary[data->id]);
}
void my_func( int anz, int *array){
...
Data data[anz];
GtkWidget c_button[anz];
for(int i=0,i<=anz, i++){
data[i].id= i;
data[i].Ary = array;
c_button[i] = gtk_button_new_with_label ("text");
g_signal_connect (c_button[i], "clicked", G_CALLBACK (b_clicked), &data[i]);
}
return 0;
}
Habe es jetzt direkt mit der Addresse des Arrayementes versucht also:
g_signal_connect (c_button[i], "clicked", G_CALLBACK (b_clicked), &array[i]);
und funktioniert, doch bringt Problem der konstanten Adresse mit sich.
Vielen Dank für Eure Unterstützung!
dml