PDA

View Full Version : فرستادن بیشتر از یک ارگومان به تابع callback چگونه امکان پذیر است؟



hamid206
پنج شنبه 03 خرداد 1386, 16:52 عصر
تابع 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_CALLBACK(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
جمعه 04 خرداد 1386, 00:56 صبح
سلام،

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

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

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

hamid206
جمعه 04 خرداد 1386, 04:36 صبح
اره تا حدودی حرف شما درسته البته من مشکل رو حل کردم بدین صورت

#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_CALLBACK(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
جمعه 04 خرداد 1386, 05:08 صبح
من دارم یه برنامه ماشین حساب می نویسم یه گیر اساسی پیدا کردم من الان برای دوتا دکمه تابع 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_CALLBACK(hi),(gpointer)b1);

b1->num="2";

g_signal_connect(G_OBJECT(button2),"clicked",G_CALLBACK(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
سه شنبه 08 خرداد 1386, 05:19 صبح
خوب خوشبختانه تونستم مشکلم رو حل کنم! اینجا یه نمونه ماشین حساب هست که با gtk نوشته شده امیدوارم براتون مفید باشه
http://www.gtkbook.com/release.php