نمایش نتایج 1 تا 5 از 5

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

  1. #1

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

    تابع 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;

    }

  2. #2
    سلام،

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

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

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

  3. #3
    اره تا حدودی حرف شما درسته البته من مشکل رو حل کردم بدین صورت
     #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;

    }

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

    }

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

تاپیک های مشابه

  1. در مورد توابع CALLBACK
    نوشته شده توسط RED-C0DE در بخش C#‎‎
    پاسخ: 6
    آخرین پست: یک شنبه 05 فروردین 1386, 23:00 عصر
  2. Callback function ها چه هستند و چگونه در دلفی فراخوانی می شوند؟
    نوشته شده توسط m-khorsandi در بخش مقالات مرتبط با Delphi/Win32
    پاسخ: 0
    آخرین پست: یک شنبه 13 اسفند 1385, 07:30 صبح
  3. ASP.NET 2 Callback
    نوشته شده توسط PrinceDotNet در بخش ASP.NET Web Forms
    پاسخ: 2
    آخرین پست: شنبه 09 اردیبهشت 1385, 20:35 عصر
  4. callback
    نوشته شده توسط titbasoft در بخش SQL Server
    پاسخ: 2
    آخرین پست: دوشنبه 26 اردیبهشت 1384, 10:38 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •