0

次のコードがあります。

int DT=45;
g_print("--Set: %d\n",DT);
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(cave_dive_toggle_cb), (gpointer) &DT);

およびコールバック関数:

void cave_dive_toggle_cb(GtkWidget *widget, gpointer data)
{
    int *ID=(int *)data;
    int DT= *ID;
    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
     g_print("clicked %d\n",DT);
    else
     g_print("unclicked %d\n",DT);
}

ダイアログを開いてボタンをクリックすると、常に次のように表示されます。

--Set: 45 
clicked 0 
unclicked 0 
clicked 0 
unclicked 0 
clicked 0 
unclicked 0

私は何か間違ったことをしていますか?私が Gtk のドキュメントを理解している限り、そうではありません。スワップ バージョンも試し、正しい CB を記述したことを確認するために最初のパラメーターを使用しました。

4

1 に答える 1

0

問題は、それDTがローカル変数であるため、関数が終了すると存在しなくなることです。あなたがする必要があるのは、次のように GINT_TO_POINTER と GPOINTER_TO_INT マクロを使用することです:

g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (cave_dive_toggle_cb), GINT_TO_POINTER (DT));

void cave_dive_toggle_cb (GtkWidget *widget, gpointer data)
{
    int DT = GPOINTER_TO_INT (data);

    ...
于 2013-03-21T12:48:18.427 に答える