2012-08-06 48 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位类型时,您希望编译器执行什么操作?我会说“以警告尖叫我!” :-)