如何在C中添加一个float到GList中?

n3h0vuf2  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(129)

有一个很棒的C库叫GLib.https://docs.gtk.org/glib/index.html,我很喜欢它,里面有一个叫GList的结构,它是一个动态增长的结构(类似于向量)。使用g_list_append(GList* list,gpointer* pointer)函数我可以在这里添加新元素但是有一个问题。如果我想添加一个Integer我可以使用GINT_TO_POINTER宏但是没有GFLOAT_TO_POINTER(但gfloat是glib中的一种类型)。我不想为一个float分配内存。我如何将一个float添加到一个GList中?

#include <stdio.h>
#include "glib.h"
#include <stdbool.h>

int main() {

        int num = 10;
        gchar* str = g_strdup("Hello");
        GList* list_name = NULL;

        list_name = g_list_append(list_name, GINT_TO_POINTER (4 + num * 3));
        list_name = g_list_append(list_name, "Hello");
        list_name = g_list_append(list_name, str);
        list_name = g_list_append(list_name, GINT_TO_POINTER(num));
        list_name = g_list_append(list_name, GINT_TO_POINTER((int)true));
        list_name = g_list_append(list_name, GINT_TO_POINTER((int)false));

        printf("%d\n", *(int*)(g_list_nth(list_name, 0)));
        printf("%s\n", (gchar*)g_list_nth(list_name, 1)->data);
        printf("%s\n", (gchar*)g_list_nth(list_name, 2)->data);
        printf("%d\n", *(int*)(g_list_nth(list_name, 3)));
        printf("%d\n", *(int*)(g_list_nth(list_name, 4)));
        printf("%d\n", *(int*)(g_list_nth(list_name, 5)));

        g_free(str);
        g_list_free(list_name);

        return 0;
}
~

这是我如何将int,bool或string添加到glist中,但我不知道如何将float添加到列表中。

0sgqnhkj

0sgqnhkj1#

我怀疑没有GFLOAT_TO_POINTER宏的原因是因为GLib支持的所有平台都不能保证浮点数与指针的位数相同或小于指针。(参见Ghashtable storing double
尽管如此,看看你的代码示例,你似乎最好使用一个结构体,因为它看起来像你的列表是固定大小的,你希望在某些索引处有某些类型。类似于这样:

struct Name {
   int number1;
   const char *static_str;
   char *str;
   int number2;
   bool b1 : 1;
   bool b2 : 1;
}

// ...

int num = 10;
char *str = g_strdup("Hello");
struct Name *name = g_new0(struct Name, 1);

name->number1 = 4 + num * 3;
name->static_str = "Hello";
name->str = str;
name->number2 = num;
name->b1 = true;
name->b2 = false;

g_free(name);
g_free(str);

相关问题