我需要交换列表中的两个项目,以便渲染时它们的顺序发生变化。
我有这个结构:

typedef struct App_Settings app_settings;
struct App_Settings
{
    GList *presets;
};

typedef struct Preset preset;
struct Preset
{
    char* title;
    float freq;
};

app_settings settings;


我写了一个函数来交换列表中的下一个项目:

GList *list_swap_next (GList *list, GList *l)
{
    GList *tmp;

    if (!l)
        return list;

    if (!l->next)
        return list;

    if (l->prev)
        l->prev->next = l->next;
    tmp = l->prev;
    l->prev = l->next;
    l->next->prev = tmp;
    if (l->next->next)
        l->next->next->prev = l;
    tmp = l->next->next;
    l->next->next = l;
    l->next = t;

    if (list == l)
        return l->prev;

    return list;
}


对于gtktreeview中的上移项目:

void move_up_button_clicked_cb(GtkWidget *widget, gpointer data)
{
    GList *l;
    preset *ps;
    int *row;
        .....................................
    row = gtk_tree_path_get_indices(path);

    ps = g_list_nth_data(settings.presets, *row);
    g_assert(ps);

    l = g_list_find (settings.presets, (gpointer)ps);
    settings.presets = list_swap_next (settings.presets, l);
        .....................................


编译时收到以下警告:

    warning: assignment makes pointer from integer without a cast [enabled by default]
    settings.presets = list_swap_next (settings.presets, l);
                     ^


当我使用GINT_TO_POINTER宏来投射list_swap_next时

settings.presets = GINT_TO_POINTER (list_swap_next (settings.presets, l));


不再从编译器输出警告,但不知道为什么不使用此“技巧”就出现警告

为什么函数GList * list_swap_next(GList * list,GList * l)似乎返回一个int?

最佳答案

问题可能是您没有分别调用list_swap_prev()g_list_swap_prev()的函数原型,因此编译器假定该函数返回int

第一步是确保命名一致(是list_swap_prev()还是g_list_swap_prev()?)

10-04 16:21