【问题标题】:Assigne unsigned long分配无符号长
【发布时间】:2020-04-08 13:23:38
【问题描述】:

我正在处理 Arduino cpp,但在设置变量(在结构中)时遇到了问题。 变量是:

struct cronStructure {
    unsigned long every;      // every
    ...
}
...
cronStructure cron[] = {...

而assignemet就是由这个片段生成的:

     unsigned long ss;
     sscanf(workBuffer+1,"%u",&ss);   // workBuffer contains d5
     cron[iEvent].every = ss;
     events.listEvents(cron);
     sprintf(printfBuffer," changed to %d\n", ss);
     Serial.println(printfBuffer);    // this shows: changed to 5
     Serial.println(cron[iEvent].every);  // this shows: 3827367941

谢谢

【问题讨论】:

  • 您遇到了什么问题?请注意,您同时使用 %u 和 %d 作为格式说明符,两者都不正确,unsigned long 应该是 %ul
  • 您显示的代码 sn-p 没有任何问题明显(@AlanBirtles 指出的格式错误除外),因此问题可能出现在其他地方。我们看不到iEvent 是否有有效值,也不知道event.listEvents(cron) 做了什么。
  • @AdrianMole 使用错误的格式说明符会导致 UB,更实际地说,OP 显示的结果并不令人惊讶。他们正在读取和写入ss 的同一部分,然后分配并打印整个ss,其中部分没有意义。
  • @walnut - 好点! (其实在我发帖之后,我也玩弄过大小不一的有符号和无符号整数,故意弄错scanf格式,得出了类似的结论。)

标签: c++ arduino long-integer unsigned


【解决方案1】:

谢谢大家。 我的问题是 Arduino simil cpp 编译器的问题,我更改了值的捕获,现在它可以工作了:

          int ss;
          sscanf(workBuffer+1,"%i",&ss);
          Serial.println(cron[iEvent].every);
          cron[iEvent].every = (unsigned long) ss;
          events.listEvents(cron);
          sprintf(printfBuffer," changed to %i\n", ss);
          Serial.println(printfBuffer);
          Serial.println(cron[iEvent].every);

【讨论】:

  • 不是编译器的问题,是你的代码的问题。正如@AlanBirtles 所指出的,您在sscanf 和sprintf 中使用了错误的说明符。当您不遵守语言规则时,您不应该对自己的错误行为感到惊讶。您只是在观察 未定义行为 的可能结果。顺便说一句,显式转换 (unsigned long) 是不必要的。
  • "我的问题是 Arduino simil cpp 编译器的问题" -> 不是的。
  • 我对 c 语言知之甚少,为什么我的解决方法没有更正?我的输入可以包含在一个整数中,当获得它时,它会被移动到一个长整数中。
  • @Rossati 您在答案中的代码现在还可以,但您在答案中的解释不是。您的代码更改不是解决方法,原始代码的行为也不是编译器的问题。您的原始代码完全错误。您听起来好像您的原始代码是正确的,但是编译器只是有一个错误,事实并非如此。在 C 和 C++ 中使用错误的格式说明符会导致 undefined behavior。您必须始终为您传递的类型使用正确的说明符,例如unsigned long 的说明符是 %ul。
  • 感谢 walnut,但更改为 %ul 不起作用,此外 sprintf 不接受 %ul。无符号长 ss; sscanf(workBuffer+1,"%ul",&ss); cron[iEvent].every = ss; events.listEvents(cron); sprintf(printfBuffer," 改为 %ul\n", ss);
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 2021-08-17
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多