如何在arduino上创建函数返回字符串?

Ris*_*hik 2 c++ arduino

我正在创建一个函数,其中读取串行并将其匹配到某个值,如果它匹配然后我将a存储string1在变量中x,否则我尝试将读取序列与第二个字符串匹配,如果匹配则我存储string2x等等.现在我希望这个函数将这个字符串(存储在变量x中)返回到调用它的main函数.

Sni*_*gus 8

你有几个选择.您可以让调用者提供将用于存储返回值的缓冲区:

void foo0(char * buf, int maxBufferSize) {
  while(maxBufferSize && *buf = getByteFromSerial()) { //assumes getByte returns 0 for done
    maxBufferSize--;
  }
}  // If you really feel like it, you can alter this to return the original buf
Run Code Online (Sandbox Code Playgroud)

您可以让方法本身维护一个缓冲区,用于返回值:

char * foo1() {
  static char buf[BUF_SIZE+1];
  int copiedBytes = 0;
  while (copiedBytes<BUF_SIZE && buf[copiedBytes++] = getByteFromSerial());
  buf[copiedBytes] = '\0';
  return buf;   // Note that when you call foo() again, this will be destroyed.
}
Run Code Online (Sandbox Code Playgroud)

您可以让方法分配缓冲区:

char * foo2() {
   static char buf[BUF_SIZE+1];
   // do all the stuff from the previous version
   char * retval = malloc(copiedBytes);
   strcpy(retval, buf);
   return retval;
 }
Run Code Online (Sandbox Code Playgroud)

最后一个解决方案存在许多问题.是的,你必须记住解除分配,但更糟糕的是,对内存如此少的东西进行动态内存分配应该会吓到你.有关详细信息,请查找内存碎片.想想看,我从来没有在微处理器上使用malloc正是出于这个原因.当内存太少时,你可能会想出更好的方法来自己动态分配内存.

我的偏好是让调用者提供缓冲区.这样,任何必要的分配和释放都可以在堆栈上得到妥善处理,并且您没有多个调用者问题,上面的foo1()会让您感到厌烦.

void someFunction() {
  char buf[BUFF_SIZE+1];
  fillMyBuffer(buf, BUFF_SIZE);
  doSomethingWithMyBuffer(buf);
}
Run Code Online (Sandbox Code Playgroud)

这样,当someFunction返回时,它的缓冲区不再占用内存,我的程序中没有一个函数,它有一个静态缓冲区占用的空间可能只是很少使用.