2017-01-23 123 views
0

如何從gpointer獲取變量以便我可以使用它。c gtk警告:初始化從指針產生整數

void 
right_y (GtkButton *button, gpointer on) 
{ 
    right(on); 
} 

這裏是回調部分 與= 「Y」 炭的線;給出警告:初始化將指針整數,未作施放[-Wint轉換]

的gsignal行給出警告:投給指針從不同大小的整數[-Wint到指針鑄]

char on = "y"; 
button = gtk_button_new_with_label ("Led On");       
g_signal_connect (button, "clicked", G_CALLBACK (right_y), (gpointer) on); 

我試過這幾種不同的方式,仍然不能得到它。

感謝。

回答

1
char on = "y"; 

聲明on作爲保持單個char。字符串不止一個char,因此您需要將它們存儲爲指向char或指向char s的指針。

問題是你想用on確定使用的正確類型。但是我想象一下,你已經知道這個錯誤的性質,並且被gpointer弄糊塗了。

gpointer基本上

typedef void *gpoiner; 

這就是爲什麼你不需要指定*gpointer。不要讓這個騙過你;當您在gpointer旁邊使用其他指針類型時,您仍然需要在其他指針類型上使用*

g_signal_connect()行是錯誤的; gpointer on是沒有意義的。

請讓我知道你是否仍然不明白我在說什麼。


好了,爲什麼

char on = "y"; 

吐出消息

warning: initialization makes integer from pointer without a cast [-Wint-conversion] 

"y"是一個指針。它評估爲const char *類型的表達式。指針可能駐留在可執行文件的代碼部分,在那裏它不能被修改(因此const)。

char是一個整數,而不是指針。除非明確要求,否則通常不應該將指針值轉換爲整數,因爲可能會使用整數類型來存儲指針。 (在需要的時候,C標準提供intptr_tuintptr_t。)在這種情況下,你沒有問,所以編譯器要確保你確實意味着你想在char中指針的地址。

請注意關於使用比必要的更小的整數部分。這就是爲什麼您的g_signal_connect()行會打印出警告:char不足以存儲指針,因此將指針視爲值會產生非常糟糕的結果。

+0

感謝您的回覆andlabs。是的,我看到這個太遲了,正在編輯我的帖子,而你回答。我還編輯了代碼並進行了編譯。該帖子已被更新爲代碼,因爲它是現在,我認爲你的權利,我也有一個錯誤的功能right()。生病消化你的話,並試圖解決問題。當我得到它時,我會給打勾。 – fernny500

+0

謝謝答覆和lalabs。我不明白的是char on =「y」,如果它在我初始化之前沒有存在,它是如何從一個指針變成一個int的。我希望我聲明並初始化一個不是指針的變量。你可能會看到我想要做的事情。我是否以錯誤的方式處理它? 如何語法回調線的gpointer數據參數我可以使用一些幫助。在right()中出錯了,使用了錯誤的,buf設置爲250,所以這就解釋了這一點。我很樂意讓GTK的一面正確。試圖解釋警告; – fernny500

+0

試圖解釋警告;希望也有幫助! – andlabs

0

這是我正在尋找的代碼。

有關回調的代碼。

char *on = 'n'; 
    button = gtk_button_new_with_label ("Led On");       
    g_signal_connect (button, "clicked", G_CALLBACK (right_y), on); 

用戶功能的代碼。

static void 
right_y (GtkButton *button, gpointer on) 
{ 
    int led_on = on; 
    right(led_on); 
}  

而且從功能權限()

void right(char state) { 
    buf[0] = state; 
    int bytes_written = 0; 
    bytes_written = write(s, buf, strlen(buf)); 
} 

char *on = 'n';給予警告

initialization makes pointer from integer without a cast [-Wint-conversion] 

我認爲這是確定相關的片段,因爲雖然有可能是更好的方法來初始化一個指針,一個指針是什麼意圖。

,行int led_on = on;給予警告

initialization makes integer from pointer without a cast [-Wint-conversion] 

同樣有可能是更好的方法,但目的是爲了傳遞一個變量不是指針。我已經測試了幾次,並沒有失敗,所以生病了。