# Native Code > برنامه نویسی با C > برنامه نویسی GTK، GTK+‎ و wxWidget >  فرستادن بیشتر از یک ارگومان به تابع callback چگونه امکان پذیر است؟

## hamid206

تابع 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_defaults(GTK_TABLE(table),button,  0,1,1,2);

gtk_table_attach_defaults(GTK_TABLE(table),e->entry1,0,3,0,1);

g_signal_connect(G_OBJECT(button),"clicked",G_CALL  BACK(hi),(gpointer)e);

gtk_widget_show(window);

gtk_widget_show(button);

gtk_widget_show(e->entry1);

gtk_widget_show(table);

gtk_main();

return 0;

}

----------


## sh_roohani

سلام،

راستش من کد شما رو کامپایل نکردم، اما دو تا اشکال به نظرم می رسه:
1. شما Entries::str رو const قرار دادین و بعدش توی کد مقداردهی کردین و
2. مقداردهی e->str هم به نظر اشتباه می رسه. شما به جای اینکه آدرس شروع یه رشته رو به اون تخصیص بدین، یه کاراکتر رو بهش تخصیص دادین.

بنابراین فکر می کنم که کد شما اصلا نباید کامپایل بشه.

نکته دیگه اینکه اگر e روی heap گرفته می شه، که به نظر همینطور میاد، ظاهرا جایی پس از gtk_main و پیش از return اونو release نکردین.

----------


## hamid206

اره تا حدودی حرف شما درسته البته من مشکل رو حل کردم بدین صورت
 #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_defaults(GTK_TABLE(table),button,  0,1,1,2);

gtk_table_attach_defaults(GTK_TABLE(table),a->entry1,0,3,0,1);

g_signal_connect(G_OBJECT(button),"clicked",G_CALL  BACK(hi),(gpointer)a);

gtk_widget_show(window);

gtk_widget_show(button);

gtk_widget_show(a->entry1);

gtk_widget_show(table);

gtk_main();

return 0;

}

----------


## hamid206

من دارم یه برنامه ماشین حساب می نویسم یه گیر اساسی پیدا کردم من الان برای دوتا دکمه تابع 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_TOPLEVEL);

table=gtk_table_new(5,4,TRUE);
*
b1=(hamid*)g_malloc(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),FALSE)  ;

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_attach_defaults(GTK_TABLE(table),button3  ,2,3,1,2);

gtk_table_attach_defaults(GTK_TABLE(table),button4  ,3,4,1,2);

gtk_table_attach_defaults(GTK_TABLE(table),button5  ,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_attach_defaults(GTK_TABLE(table),button8  ,3,4,2,3);

gtk_table_attach_defaults(GTK_TABLE(table),button9  ,0,1,3,4);

gtk_table_attach_defaults(GTK_TABLE(table),button1  0,1,2,3,4);

gtk_table_attach_defaults(GTK_TABLE(table),button1  1,2,3,3,4);

gtk_table_attach_defaults(GTK_TABLE(table),button1  2,3,4,3,4);

gtk_table_attach_defaults(GTK_TABLE(table),button1  3,0,1,4,5);

gtk_table_attach_defaults(GTK_TABLE(table),button1  4,1,2,4,5);

gtk_table_attach_defaults(GTK_TABLE(table),button1  5,2,3,4,5);

gtk_table_attach_defaults(GTK_TABLE(table),button1  6,3,4,4,5);

*g_signal_connect(G_OBJECT(button1),"clicked",G_CAL  LBACK(hi),(gpointer)b1);

b1->num="2";

g_signal_connect(G_OBJECT(button2),"clicked",G_CAL  LBACK(hi),(gpointer)b1);
*
gtk_widget_show(window);
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(button11);

gtk_widget_show(button12);
gtk_widget_show(button13);

gtk_widget_show(button14);
gtk_widget_show(button15);

gtk_widget_show(button16);
*gtk_widget_show(b1->entry);
*
gtk_main();

return 0;

}

----------


## hamid206

خوب خوشبختانه تونستم مشکلم رو حل کنم! اینجا یه نمونه ماشین حساب هست که با gtk نوشته شده امیدوارم براتون مفید باشه
http://www.gtkbook.com/release.php

----------

