gpt4 book ai didi

不同数据类型的转换

转载 作者:行者123 更新时间:2023-12-03 14:54:32 25 4
gpt4 key购买 nike

我是 C 的新手并试图创建字典的类似物,但遇到了打字问题。我的字典知道如何仅为 const char 创建键值,我想扩展程序以便它也可以使用其他数据类型的值,尝试使用指向 void 的指针,但问题仍然存在,我有一些问题:

是否可以使函数将字典转换为不同类型的数据?

我怎样才能做到这一点?

主要代码:

#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>

#define MAXSIZE 5000

struct base
{
uint8_t *up;
uint8_t size;
};

typedef struct
{
struct base key[MAXSIZE];
struct base data[MAXSIZE];
uint8_t index;
} dict_t;

static dict_t *init (uint8_t s_key, uint8_t s_data)
{
dict_t *dict;

dict = (dict_t *) malloc(sizeof(dict_t));
dict -> key -> up = (uint8_t *) malloc(s_key);
dict -> data -> up = (uint8_t *) malloc(s_data);

dict -> key -> size = s_key;
dict -> data -> size = s_data;
dict -> index = 1;

return dict;
}

dict_t *newDict (const char *key, const char *data)
{
dict_t *dict;
uint8_t s_key;
uint8_t s_data;

s_key = strlen(key);
s_data = strlen(data);

dict = init(s_key, s_data);

memcpy(dict -> key, key, s_key);
memcpy(dict -> data, data, s_data);

return dict;
}

void printDict (dict_t *dict)
{
for (int i = 0; i < dict -> index; i++)
{
fwrite(dict -> key, sizeof(uint8_t), dict -> key -> size, stdout);
fwrite(": ", sizeof(char), 2, stdout);
fwrite(dict -> data, sizeof(uint8_t), dict -> data -> size, stdout);
}
}

主功能
#include "dict.c"

int main ()
{
dict_t *dict;

dict = newDict("key", "data\n");
printDict(dict);

return 0;
}

非常感谢。

最佳答案

简短回答:你不能(但请看长答案)。
长答案:
您可以使用两个技巧,尽管它们并不完美。
第一个是空指针。
空指针没有类型,因此可用于指向任何指针的值。但是,指针不存储它指向的值的类型。这可能会导致问题,因为您必须使用类型转换来取消引用它,这需要您事先知道类型。您可以使用结构来存储类型以及指针,然后使用 if 语句适本地取消引用它:

enum Type {
Int,
Str
//add more types
}
struct base {
enum Type type;
void *value;
}
第二个技巧是使用 union 。与第一个非常相似,只是使用 union 而不是空指针:
enum Type {
Int,
Str
//add more types here
}
struct base {
enum Type type;
union {
int i;
char s[20];
//add more types here
} values;
}
您将再次使用 if 语句来选择 union 的正确字段。

关于不同数据类型的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59863835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com