【问题标题】:Printf prints wrong value when trying to print the variable alone, prints the right value when printing this variable along with another variablePrintf 在尝试单独打印变量时打印错误的值,在打印此变量和另一个变量时打印正确的值
【发布时间】:2014-03-27 23:29:50
【问题描述】:

我有一个嵌入式板和一个连接到它的相机。我正在尝试在嵌入式板的控制台输出上打印来自相机的时间戳。时间戳被访问并加载到一个结构中,并使用 printf 打印出来,如下:

这段代码在循环中。

f.timestamp = hrt_absolute_time(); // Inbuilt function
printf("Timestamp is %u",f.timestamp);

如果运行这些行,它总是打印“Timestamp is 77”。如果我这样做:

counter = 1;
f.timestamp = hrt_absolute_time();
printf("The %d st timestamp is %u",counter,f.timestamp);

如果运行这些行,它会打印“第一个时间戳是”,并且时间戳每秒更新一次。我的问题是,如此微不足道的事情怎么会造成如此巨大的差异?是因为一些旧的 printf 没有清除标准输出缓冲区吗?此模块中没有其他打印语句。有没有人有任何想法?提前致谢!

整个区块:

if (msg->msgid == MAVLINK_MSG_ID_OPTICAL_FLOW) {
    mavlink_optical_flow_t flow;
    mavlink_msg_optical_flow_decode(msg, &flow);

    struct optical_flow_s f;

    f.timestamp = hrt_absolute_time();
    f.flow_raw_x = flow.flow_x;
    f.flow_raw_y = flow.flow_y;
    f.flow_comp_x_m = flow.flow_comp_m_x;
    f.flow_comp_y_m = flow.flow_comp_m_y;
    f.ground_distance_m = flow.ground_distance;
    f.quality = flow.quality;
    f.sensor_id = flow.sensor_id;

    printf("Timestamp is %u",f.timestamp);
            //OTHER CODE FOLLOWS

【问题讨论】:

  • 我们能看到整个循环吗?从这个例子我看不出有什么明显的错误。我从中看到的唯一可能性是编译器缓存了 hrt_absolute_time 的读取值并且从不更新它,因为它是硬件映射的但没有标记为 volatile。
  • 也许你应该试试 2 printf 看看发生了什么 printf("the %d st", counter); printf("时间戳为 %u", f.timestamp);
  • 我不认为uit会是时间戳的缓存值,因为时间戳是以微秒为单位的,所以显然是一个比77大得多的值。我不知道整个循环是不是这样虽然内容丰富..我现在有问题了。
  • 只有我能想到的其他事情是mavlink_msg_optical_flow_decode 中可能的内存损坏或timestamphrt_absolute_time 的 ret 值之间的类型不匹配?和你一样难过。也许编译器警告可能会提供线索。
  • 电路板有一个地面控制软件,可以很好地打印这些值。看起来标准输出缓冲区有问题?不确定它是什么,但感谢您的输入。

标签: c printf stdout


【解决方案1】:

根据 cmets 中的信息,f.timestamp 的类型为 uint64_t

除非uint64_tunsigned int 是同一类型,否则

printf(" timestamp is %u", f.timestamp);

未定义。

标题<inttypes.h> 定义了许多整数类型的格式宏,但我发现转换为已知类型更容易:

printf(" timestamp is %ju", (uintmax_t)f.timestamp);

printf(" timestamp is %llu", (unsigned long long)f.timestamp);

【讨论】:

  • 铸造长长的作品!我看到了我的错误。你能解释一下为什么在这之前引入 avnother 变量导致它工作,即使它仍然写为 %u?
  • @HighVoltage: printf 期待 32 位值;你给了它一个 64 位的值。您看到的行为可能与将参数值传递给printf 的方式有关,可能在堆栈上。但坦率地说,不值得努力追查细节,因为无论如何你已经解决了问题。 (虽然这种一般的症状确实倾向于暗示格式字符串不匹配,这对于将来的调试将是有用的知识。)
  • 知道了。感谢您的帮助。
  • 抱歉,我为uintmax_t 使用了错误的格式字符串。 "%zu" 代表size_t"%ju" 代表 uintmax_t。我现在已经修好了。 (请注意,这都是在 C99 中引入的;一些编译器(coughMicrosoftcough)可能不支持它。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多