2017-04-09 8 views
0

g_signal connectを使用して、 "data"フィールドを使用して単純な文字 'S'のパラメータを渡そうとしています。cデータフィールドを使用するGTK g_signal_connect

???(私はフィールドがデータ用ではなく、データ用のポインタであることを理解していると思います)??? my_test 2つのパラメータまたは1つを受け入れるべきかどう

void my_test(GtkMenuItem *menuitem, gpointer data) 
{ 
    printf("Pointer variable contains: %p\n", data); 
} 

私はわからない。このような

g_signal_connect (G_OBJECT(b_save), "clicked", my_test, (gpointer) 'S'); 

呼び出すコード:

とにかく、私はこのようなコードがありますか? 私は指し示す値 'S'をどのように印刷するか分かりません。

答えて

0

'S'が文字定数です(私と呼ばれる機能では、私は「S」で入手できますか?my_test)。文字列リテラルとは異なり、文字定数はアドレス指定できません。そのため、コールバックのデータパラメータには'S'へのポインタは含まれていません(定数1へのポインタを含むことができます)。代わりに、gpointerとして再解釈された定数の値です。

あなたのCの実装が整数とポインタ間の1対1のマッピングを保証している場合、あなたはあなたのセットアップを維持し、あなたのコールバックは次のように印刷することができます:

その後、
printf("Data variable contains: %c\n", (char)data); // char and NOT char* 

あなたがアドレスを渡したい場合は、いくつかのストレージのアドレスを渡す必要があります。さらに重要なのは、コールバックが実行される前に期限切れにならないストレージです。メモリを動的に割り当てるのがおそらく最適ですが、静的変数のアドレスも渡すことができます:

static char data = 'S'; 
g_signal_connect (G_OBJECT(b_save), "clicked", my_test, &data); 
// ... 
printf("Data variable contains: %c\n", *(char*)data); // Now data is a pointer to a single character. 
+0

まだmy_testには1つまたは2つのパラメータがありますか? –

+0

私はまだそれを分類していません。 [OK]を私は入れて:静的なcharデータ= 'S'を使用して&呼び出してデータ。 my_testは1つまたは2つのパラメータを受け取りますか?どのように見える?また、printf( "データ変数には%c \ n"、(char)データが含まれています。コンパイラエラーが発生します。警告:ポインタから異なるサイズの整数にキャスト[-Wpointer-to-int-cast]。 –

+0

@GraemeJensz - 私は2つの排他的なオプションを提示しました。あなたは定数を渡し続けるか、アドレスを渡します。あなたがキャラクターに住所を渡すなら、それをそのまま扱う(私は答えを更新した)。文字値そのものを渡すと(ポインタにキャストした後)、それを文字にキャストする必要があります。警告を取り除くには、 'char(char(char)(int)data')にキャストする前に' int'または 'long'に中間キャストを行います。 – StoryTeller

関連する問題