2017-04-09 55 views
0

使用g_signal connect,我試圖使用「data」字段傳遞一個簡單字符'S'的參數。c使用數據字段的GTK g_signal_connect

???(我想我明白該字段不是用於數據,而是用於指向數據的指針)。

無論如何,我有這樣的代碼:

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

調用代碼是這樣的:

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

我不知道是否應該my_test接受兩個參數或一個? 我不知道如何打印指向值'S'。 (在我的調用函數my_test我如何才能在「S」?)

回答

0

'S'是一個字符常量。與字符串文字不同,字符常量不可尋址,它們只是僞裝的數字。因此,回調中的數據參數不包含指向'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

我還沒有整理它out.Does my_test接收一個或兩個參數? –

+0

我還沒有整理出來。好的,我把:靜態char數據='S',並在調用中使用&數據。 my_test是否接收一個或兩個參數?它應該怎麼看?和printf(「數據變量包含:%c \ n」,(char)數據);產生編譯器錯誤:警告:從指針轉換爲不同大小的整數[-Wpointer-to-int-cast]。 –

+0

@GraemeJensz - 我提出了兩個獨家選擇。你要麼保持傳遞一個常量,要麼傳遞一個地址。如果你將一個地址傳遞給一個角色,那麼就把它當作(我更新了答案)。如果您將字符值本身傳遞(在投射到指針後),則需要將其轉換回字符。爲了擺脫這個警告,在鑄造到char之前(即'(char)(int)data')進行中間轉換爲'int'或'long'。 – StoryTeller