2012-08-06 73 views
0

當我在and64平臺編譯「從大小不同的整數轉換爲指針」: 我似乎無法弄清楚。下面是其中一條線路有麻煩:獲取:警告(AMD64)

static gboolean scan_freq(gpointer data) 
{ 
    static gint start, mom, max; 
    gint dir = (gint)(data); /// <- cast to pointer from integer of different size 

    if (!max) { 
     max = (FREQ_MAX - FREQ_MIN) * STEPS; 
    } 

    if (radio_check_station(gtk_adjustment_get_value(adj)/STEPS) || (start > max)) { 
     start = mom = 0; 
     radio_unmute(); 
     timeout_id = 0; 
     return FALSE; 
    } 
    if (!mom) { 
     mom = gtk_adjustment_get_value(adj); 
    } 

    if (mom > FREQ_MAX*STEPS) 
     mom = FREQ_MIN*STEPS; 
    else if (mom < FREQ_MIN*STEPS) 
     mom = FREQ_MAX*STEPS; 
    else  
     mom = mom + dir; 
    start += 1; 
    gtk_adjustment_set_value(adj, mom); 

    return TRUE; 
} 

和:

extern int mom_ps; 
void preset_menuitem_activate_cb(GtkMenuItem *menuitem, gpointer user_data) 
{ 
    preset* ps; 
    mom_ps = (int)user_data; /// <- cast to pointer from integer of different size 

    g_assert(mom_ps >= 0 && mom_ps < g_list_length(settings.presets)); 

    ps = (preset*)g_list_nth_data(settings.presets, mom_ps); 
    gtk_adjustment_set_value(adj, ps->freq * STEPS); 
} 

獲取:cast to pointer from integer of different size警告

+0

您的意思是解除引用某些東西嗎? – 2012-08-06 01:46:23

+0

你確定*這是你得到的消息嗎?使用類似的代碼,我可以「將*從*指針*轉換爲*不同大小的整數」,這可以準確描述問題。 gcc(你使用的是gcc,對吧?)不太可能會出現這樣的錯誤。 – 2012-08-06 02:45:18

+0

爲什麼你要將'gpointer'的值轉換爲'gint'呢?這沒有多大意義。 – 2012-08-06 02:46:27

回答

1

它實際上是一個令人困惑的錯誤信息,因爲你似乎是鑄造離開從一個指針。

但是,錯誤基本上是抱怨類型不兼容。

假設你實際上已經傳遞了一個整數作爲指針(Gnome特別禁止嘗試存儲整型指針),你應該使用實際的類型轉換宏,如GPOINTER_TO_INT

相反,如果該指針是指向一個整數,你應該deferencing它,而不是鑄造的,是這樣的:

gint dir = *((gint*)data); 

,它只是發生在AMD64事實是,因爲這是那種平臺,其中指針和整數將是不同的大小,一個64位,另一個32位。

+0

你好。只有當我在amd64平臺上編譯時纔會發生這種情況。 – Cecylia 2012-08-06 09:45:12

+0

@ user1501424:這很有道理,AMD64可能會有不同大小的整數和指針。該解決方案仍然使用Gnome宏。 – paxdiablo 2012-08-06 11:41:19

1

大概情況下,sizeof GINT和gpointer是不一樣的。 你確定你知道你在做什麼嗎?你爲什麼使用指針作爲int?

如果您確信這是正確的,那麼你需要使用一個整數同樣大小的指針,可能gint64或巨龍,而不是GINT。

另外,glib的維護者說過:「記住,你可能不會在指針中存儲指針,這不適用於任何形式或形式。」所以無論你想做什麼 - 它做錯了。

+0

+1用於明確指針不是整數(或數組)。 – Jens 2012-08-06 09:47:42

0

這可能意味着你的指針是64位,而你的整數都是32位相同。當您將64位分配給32位類型時,您希望編譯器執行什麼操作?我會說「以警告尖叫我!」 :-)