0

当我在 and64 平台上编译时:我似乎无法弄清楚。这是它遇到问题的行之一:

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警告

4

4 回答 4

1

这实际上是一条令人困惑的错误消息,因为您似乎正在远离指针。

但是,错误基本上是抱怨类型不兼容。

假设您实际上已将整数作为指针传递(Gnome 特别禁止尝试将指针存储为整数类型),您可能应该使用实际的类型转换宏,例如GPOINTER_TO_INT

相反,如果该指针是指向整数的指针,则应该将其推迟而不是强制转换,例如:

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

它只发生在 AMD64 上的事实是因为在这种平台上,指针和整数的大小不同,一个是 64 位,另一个是 32 位。

于 2012-08-06T01:48:20.357 回答
1

可能,gint 和 gpointer 的大小不一样。你确定你知道你在做什么吗?为什么将指针用作 int?

如果您确定这是正确的,那么您需要使用与指针大小相同的整数,可能是 gint64 或 glong 而不是 gint。

glib 维护者也说过“记住,你不能将指针存储在整数中。这在任何形状或形式下都不可移植。” 所以无论你试图做什么——它都做错了。

于 2012-08-06T01:49:00.027 回答
0

您应该使用GPOINTER_TO_INT:http: //developer.gnome.org/glib/unstable/glib-Type-Conversion-Macros.html

执行此操作时,您必须使用相应的宏将指针存储为 int。您应该能够使用以下方法查看指针大小和 int 大小是否相同printf("%d %d",sizeof(gpointer),sizeof(int))

于 2012-08-06T01:49:08.507 回答
0

这可能意味着您的指针是 64 位,而您的整数是 32 位。当您将 64 位分配给 32 位类型时,您希望编译器做什么?我会说“向我尖叫并发出警告!” :-)

于 2012-08-06T09:50:41.310 回答