我刚开始使用ncurses
。数组validity
定义为
static const char* validity[] = {
"invalid",
"valid"
};
允许我在必要时将0
映射到invalid
,将1
映射到valid
,以便在我的应用中提供更易读的输出。
我的代码中还有以下几行:
if(data->pos != NULL) {
mvprintw(4, 0,
"Position: X %5d Y %5d Z %5d \n",
data->pos->x, data->pos->y, data->pos->z);
// ...
}
这允许我输出存储在struct data
内的3D坐标,该坐标每秒更新多次并填充新坐标。它没有任何问题。
我接下来要使用mvprintw(...)
输出单个字符串参数:
if(data->detected != NULL) {
mvprintw(5, 0,
"Detected: %s\n",
booleans[data->detected]);
}
其中booleans
与validity
数组非常相似,但内部有true
和false
个字符串,用于将布尔值映射到字符串。这也有效!
但是,以下代码会输出一个奇怪的结果:
if(data->validity_check != NULL) {
mvprintw(11, 0,
"Validity: %d [%s]\n",
data->validity_check->timestamp,
validity[data->validity_check->valid]);
}
validity_check
只是另一个struct
,其中包含timestamp
(长整数)和valid
标记,可以是0
或{{1 }}
输出应该看起来像
1
但我得到了
Validity: 123456789 [invalid]
我对此感到非常惊讶并使用Validity: 123456789 [(null)]
输出以查看printf()
是否实际包含有效数据(这是C阵列的问题 - 没有检查出来的界限)。结果:它做到了。正如预期的那样,值在valid
和0
之间跳跃。然而,出于某种原因,第二个论点似乎是#34;破坏了#34;。我甚至从数组中删除了检索并使用了硬编码的参数值,但仍然没有变化。
进一步的调查使我重写了这部分代码:
1
它没有任何问题,我得到了理想的结果。但是我不知道我在这里做错了什么。我已多次查看documentation但我可能遗漏了一些东西,因为我无法找到任何可以解释此行为的内容。
答案 0 :(得分:2)
你写道:
validity_check
只是另一个struct
,其中包含timestamp
(长整数)和valid
标记,可以是0
或{{1 }}
如果1
是timestamp
,则应使用long int
格式,而不仅仅是%ld
:
%d
if (data->validity_check != NULL) {
mvprintw(11, 0,
"Validity: %ld [%s]\n",
data->validity_check->timestamp,
validity[data->validity_check->valid]);
}
函数族是变量函数,格式字符串必须告诉它们确切使用哪种类型。 (这与普通函数不同,其中参数的类型是已知的,类型会根据需要变窄或提升。)
这是一种常见的错误类型,但是启用警告应该告诉您这种格式不匹配,至少在GCC和Clang中。