0

and64プラットフォームでコンパイルすると:理解できないようです。これが問題を抱えている行の1つです:

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でのみ発生するという事実は、ポインターと整数が異なるサイズ(1つは64ビット、もう1つは32ビット)になる一種のプラットフォームであるためです。

于 2012-08-06T01:48:20.357 に答える
1

おそらく、gintとgpointerのサイズは同じではありません。自分が何をしているのか知っていますか?なぜポインタをintとして使用しているのですか?

それが正しいと確信している場合は、ポインタと同じサイズの整数を使用する必要があります。おそらく、gintの代わりにgint64またはglongを使用します。

また、glibのメンテナは、「ポインタを整数に格納することはできません。これは、いかなる形や形式でも移植できません」と述べています。だからあなたがやろうとしていることは何でも-それは間違って行われている。

于 2012-08-06T01:49:00.027 に答える
0

これは、ポインタが64ビットであり、intが32ビットであることを意味している可能性があります。64ビットを32ビット型に割り当てるときにコンパイラが何をすることを期待しますか?私は「警告を出して私に向かって叫びなさい!」と言います。:-)

于 2012-08-06T09:50:41.310 に答える
0

使用する必要があります:http GPOINTER_TO_INT//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 に答える