我的问题是 atoi 将字符串的十六进制内存地址转换为十进制,而不是字符串中包含的内容。它在宏期间执行此操作。当宏定义使其成为 int 时,为什么将 struct->member 解释为指针?伪代码如下:
if (struct.member == int)? struct.member = atoi(data) : struct.member = data;
程序这一部分的目的是从包含结构属性信息的 .csv 文件中检索数据。我可以接受一个“id”并将每个单元格字符串存储到一个字符串数组(csvRowSplit)中。
但是,然后我想将数组的内容传输到包含不同数据类型的结构(我想用来检索玩家保存的属性、攻击方法、商店物品等的方法)。硬编码很容易:
opponent->att = atoi(csvSplitRow[0]);
opponent->= atoi(csvSplitRow[1]);
opponent->hitpoints = atoi(csvSplitRow[2]);
opponent->description = csvSplitRow[3]);
然而,这会导致更多的结构成员变得混乱,并且不是很灵活或可重现。
我已经定义了一个宏来循环遍历结构的元素,并将 csvSplitRow[] 与变量配对,如果需要,可以使用 atoi 进行转换。
#define X_FIELDS \
X(char*, description, "%s") \
X(int, xpreward, "%d") \
X(int, att, "%d") \
/* ... */
X(int, crit, "%d")
typedef struct
{
#define X(type, name, format) type name;
X_FIELDS
#undef
}
void update_opp(char** csvSplitRow, opp* opponent)
{
int i = 0;
#define X(type, name, format) \
if (strcmp(format, "%d") == 0) \ // if an int, convert it
opponent->name = atoi(csvSplitRow[i]); \
else \ // otherwise put it straight in
opponent->name = csvSplitRow[i]; \
i++;
X_FIELDS
#undef X
}
直接分配给字符串成员的工作(即没有转换),但 atoi 导致将十六进制内存地址转换为整数,而不是它指向的字符串。
// before conversion
csvRowSplit[1] == 0x501150 "20"
// practice
atoi(csvRowSplit[1]) == 20
// after conversion and storing in struct int member
opponent->xpreward = atoi(csvSplitRow[1]);
opponent->xpreward == 5247312 // the decimal equivalent of 0x501150
我不知道我现在能做什么,除了每次我想将解析的 csv 行与结构匹配时硬编码。请帮忙!
编辑:我使用 -Werror 得到一个编译时错误:
error: assignment makes integer from pointer without a cast [-Werror]
错误在 update_opp 函数的宏中。但是,我知道它不是指针,因为我之前将它定义为 int ?那它为什么不承认呢?我不能施放它,那我该怎么办?