【问题标题】:Overloading function handling char and String重载函数处理 char 和 String
【发布时间】:2021-11-01 22:16:38
【问题描述】:

我正在创建一个函数来处理消息,然后使用 Serial.println() 打印消息。我有它的工作,但遇到了一个我无法解释的问题。下面的第一个示例代码有效,第二个(交换我的函数声明的顺序)将编译和加载,但会导致 Teensy 4.1 崩溃。我在 VSCode 上使用 PlatformIO。

谁能告诉我第二个代码有什么问题,为什么它会编译没有错误,但不能运行?

这行得通:

#include <Arduino.h>

void LogMsg(const char *msg){
  Serial.println(msg);
}
void LogMsg(String s){ LogMsg(s.c_str()); }

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("reset");
}

void loop() {
  // put your main code here, to run repeatedly:

  String str3 = "testing string cat ";
  uint32_t var = 12345;
  LogMsg(str3 + var);

  delay(500);
}

这会编译、加载,但会崩溃,导致连续重置:

#include <Arduino.h>

void LogMsg(String s){ LogMsg(s.c_str()); }   // <-- swapped order
void LogMsg(const char *msg){                 // <-- swapped order
  Serial.println(msg);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("reset");
}

void loop() {
  // put your main code here, to run repeatedly:

  String str3 = "testing string cat ";
  uint32_t var = 12345;
  LogMsg(str3 + var);

  delay(500);
}

编辑:void LogMsg(String s) 的定义已更改以反映原始错误和@hcheung 建议的简化。行为保持不变。第一个实例有效,第二个崩溃。

【问题讨论】:

  • 其实不需要两个函数,可以用LogMsg(String.c_str());调用LogMsg()。或者如果你真的需要两个重载函数,使用void LogMsg(String s) { LogMsg(s.c_str(); }会更简单,错误更少。
  • 顺便说一句,它崩溃的原因是因为您为 buf[n] 分配的内存小于您尝试复制到的 String 对象。
  • @hcheung - 感谢您的简化。但是,随着您的更改,问题仍然存在。第一次定义void LogMsg(String s){ LogMsg(s.c_str()); } 时,程序崩溃,第二次定义时,它可以工作。有什么想法吗?
  • 嗯,这似乎与platformIO有关,它不会崩溃并在Arduino IDE上正确执行,但当我在platformIO(使用Atom)上运行它时无法正常工作。我不知道原因,但是您可以通过将函数更改为LogMsg(String s) { Serial.println(s.c_str()); } 使其正常运行(即不调用其他重载函数)。
  • @Juraj, String.toCharArray() 有经典的“short-by-1”问题,如果是n = String.length(),则需要传入n+1才能得到完整的字符串@987654331 @,否则会缩短一个字符,也就是说buf必须是char buf[n+2]。

标签: arduino platformio teensy


【解决方案1】:

C 字符串以'\0' 结尾。因此toCharArray() 将在您的 Ardunio 字符串中附加一个空字符。否则,每次要使用该字符串时,您都必须为 char 指针提供一个长度。

您的 char 数组必须足够大以容纳这个额外的字符,否则如果 toCharArray 没有首先抛出异常,您将导致访问冲突。

【讨论】:

  • 感谢指正。但是,修复 char buf[n] 不会改变行为。在第一个代码中,一切正常,在第二个代码中它崩溃了,唯一的变化是定义 LogMsg() 的顺序。与 char buf[n+1] 的行为相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-15
  • 2013-01-03
  • 2015-06-04
  • 2019-03-22
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多