我需要交换列表中的两个项目,以便渲染时它们的顺序发生变化。
我有这个结构:
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()
?)