تابع g_signal تنها مي زاره يه ارگومان بفرستيم به تابع callback براي فرستادن چند شي و چند نوع داده به تابع callback چكار بايد انجام داد؟ من مي دونم بايد از struct استفاده كرد ولي دقيقا نمي دونم چطور اگه كسي در اين مورد اطلاعي داره توضيح بده با ذكر يه مثال من خودم يه چيزي نوشتم ولي نمي دونم چرا اجرا نمي شه من مي خوام يك داده و يه شي رو به يك تابع callback كليك يك دكمه بفرستم. اشتباه كد زير كجاست؟ كد: #include gtk/gtk.h typedef struct{GtkWidget *entry1;const gchar *str;}Entries;void hi(GtkWidget *widget,gpointer data){Entries *e=(Entries*)data;g_print(e- str);}int main(int argc,char *argv[]){gtk_init( argc, argv);GtkWidget *window;GtkWidget *button;GtkWidget *table;Entries *e=g_slice_new(Entries);e- entry1=gtk_entry_new();e- str='1';window=gtk_window_new(GTK_WINDOW_TOPLEVEL) ; button=gtk_button_new_with_label( Click );table=gtk_table_new(3,3,TRUE);gtk_container_add( GTK_CONTAINER(window),table);gtk_table_attach_defa ults(GTK_TABLE(table),button,0,1,1,2);gtk_table_at tach_defaults(GTK_TABLE(table),e- entry1,0,3,0,1);g_signal_connect(G_OBJECT(button), clicked ,G_CALLBACK(hi),(gpointer)e);gtk_widget_show(windo w);gtk_widget_show(button);gtk_widget_show(e- entry1);gtk_widget_show(table);gtk_main();return 0;}سلام،راستش من كد شما رو كامپايل نكردم، اما دو تا اشكال به نظرم مي رسه:1. شما Entries::str رو const قرار دادين و بعدش توي كد مقداردهي كردين و2. مقداردهي e- str هم به نظر اشتباه مي رسه. شما به جاي اينكه آدرس شروع يه رشته رو به اون تخصيص بدين، يه كاراكتر رو بهش تخصيص دادين.بنابراين فكر مي كنم كه كد شما اصلا نبايد كامپايل بشه.نكته ديگه اينكه اگر e روي heap گرفته مي شه، كه به نظر همينطور مياد، ظاهرا جايي پس از gtk_main و پيش از return اونو release نكردين.اره تا حدودي حرف شما درسته البته من مشكل رو حل كردم بدين صورتكد: #include gtk/gtk.h struct hamid{GtkWidget *entry1;const gchar *str;}*a;void hi(GtkWidget *widget,gpointer data){g_print(a- str);}int main(int argc,char *argv[]){gtk_init( argc, argv);GtkWidget *window;GtkWidget *button;GtkWidget *table; a=(hamid*)g_malloc(sizeof(hamid));a- entry1=gtk_entry_new();a- str= 1 ;window=gtk_window_new(GTK_WINDOW_TOPLEVEL); button=gtk_button_new_with_label( Click );table=gtk_table_new(3,3,TRUE);gtk_container_add( GTK_CONTAINER(window),table);gtk_table_attach_defa ults(GTK_TABLE(table),button,0,1,1,2);gtk_table_at tach_defaults(GTK_TABLE(table),a- entry1,0,3,0,1);g_signal_connect(G_OBJECT(button), clicked ,G_CALLBACK(hi),(gpointer)a);gtk_widget_show(windo w);gtk_widget_show(button);gtk_widget_show(a- entry1);gtk_widget_show(table);gtk_main();return 0;}من دارم يه برنامه ماشين حساب مي نويسم يه گير اساسي پيدا كردم من الان براي دوتا دكمه تابع callback نوشتم و يك شي و يك مقدار رو با استفاده از struct به callback فرستادم اما الان تابع void hi(GtkWidget *widget,gpointer data) موندم مي خوام هر دكمه كه فشار داده ميشه كاركتر مربوط به اون تو entry نوشته بشه ولي الان نمي دونم چه كدي بنويسم كه براي هر دكمه b1- num=”n” رو بفرسته برنامه رو كامپايل و اجرا كنيد خودتون متوجه مي شيد مشكل من كجاستكد: #include gtk/gtk.h #include iostream #include string #include cctype struct hamid{GtkWidget *entry;const gchar *num;}*b1;void hi(GtkWidget *widget,gpointer data){gtk_entry_set_text(GTK_ENTRY(b1- entry),b1- num);}int main(int argc,char *argv[]){gtk_init( argc, argv); GtkWidget *window;GtkWidget *table;GtkWidget *button1;GtkWidget *button2;GtkWidget *button3;GtkWidget *button4;GtkWidget *button5;GtkWidget *button6;GtkWidget *button7;GtkWidget *button8;GtkWidget *button9;GtkWidget *button10;GtkWidget *button11;GtkWidget *button12;GtkWidget *button13;GtkWidget *button14;GtkWidget *button15;GtkWidget *button16;window=gtk_window_new(GTK_WINDOW_TOPLEVE L);table=gtk_table_new(5,4,TRUE);b1=(hamid*)g_mall oc(sizeof(hamid));b1- entry=gtk_entry_new();b1- num= 1 ;button1=gtk_button_new_with_label( 1 );button2=gtk_button_new_with_label( 2 );button3=gtk_button_new_with_label( 3 );button4=gtk_button_new_with_label( 4 );button5=gtk_button_new_with_label( 5 );button6=gtk_button_new_with_label( 6 );button7=gtk_button_new_with_label( 7 );button8=gtk_button_new_with_label( 8 );button9=gtk_button_new_with_label( 9 );button10=gtk_button_new_with_label( 0 );button11=gtk_button_new_with_label( = );button12=gtk_button_new_with_label( + );button13=gtk_button_new_with_label( - );button14=gtk_button_new_with_label( / );button15=gtk_button_new_with_label( * );button16=gtk_button_new_with_label( . );gtk_window_set_resizable(GTK_WINDOW(window),FALS E);gtk_container_add(GTK_CONTAINER(window),table); gtk_table_attach_defaults(GTK_TABLE(table),b1- entry,1,3,0,1);gtk_table_attach_defaults(GTK_TABLE (table),button1,0,1,1,2);gtk_table_attach_defaults (GTK_TABLE(table),button2,1,2,1,2);gtk_table_attac h_defaults(GTK_TABLE(table),button3,2,3,1,2);gtk_t able_attach_defaults(GTK_TABLE(table),button4,3,4, 1,2);gtk_table_attach_defaults(GTK_TABLE(table),bu tton5,0,1,2,3);gtk_table_attach_defaults(GTK_TABLE (table),button6,1,2,2,3);gtk_table_attach_defaults (GTK_TABLE(table),button7,2,3,2,3);gtk_table_attac h_defaults(GTK_TABLE(table),button8,3,4,2,3);gtk_t able_attach_defaults(GTK_TABLE(table),button9,0,1, 3,4);gtk_table_attach_defaults(GTK_TABLE(table),bu tton10,1,2,3,4);gtk_table_attach_defaults(GTK_TABL E(table),button11,2,3,3,4);gtk_table_attach_defaul ts(GTK_TABLE(table),button12,3,4,3,4);gtk_table_at tach_defaults(GTK_TABLE(table),button13,0,1,4,5);g tk_table_attach_defaults(GTK_TABLE(table),button14 ,1,2,4,5);gtk_table_attach_defaults(GTK_TABLE(tabl e),button15,2,3,4,5);gtk_table_attach_defaults(GTK _TABLE(table),button16,3,4,4,5);g_signal_connect(G _OBJECT(button1), clicked ,G_CALLBACK(hi),(gpointer)b1);b1- num= 2 ;g_signal_connect(G_OBJECT(button2), clicked ,G_CALLBACK(hi),(gpointer)b1);gtk_widget_show(wind ow);gtk_widget_show(table);gtk_widget_show(button1 );gtk_widget_show(button2);gtk_widget_show(button3 );gtk_widget_show(button4);gtk_widget_show(button5 );gtk_widget_show(button6);gtk_widget_show(button7 );gtk_widget_show(button8);gtk_widget_show(button9 );gtk_widget_show(button10);gtk_widget_show(button 11);gtk_widget_show(button12);gtk_widget_show(butt on13);gtk_widget_show(button14);gtk_widget_show(bu tton15);gtk_widget_show(button16);gtk_widget_show( b1- entry);gtk_main();return 0;}خوب خوشبختانه تونستم مشكلم رو حل كنم! اينجا يه نمونه ماشين حساب هست كه با gtk نوشته شده اميدوارم براتون مفيد باشهRelease of Foundations of GTK+ Development