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

时间:2014-07-22 09:43:21

标签: c++ arduino

我正在创建一个函数,其中读取串行并将其匹配到某个值,如果它匹配,那么我将string1存储在变量x中,否则我尝试将读取序列与第二个字符串,如果它匹配,那么我将string2存储在x中,依此类推。现在我希望这个函数将这个字符串(存储在变量x中)返回到调用它的主函数。

1 个答案:

答案 0 :(得分: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

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

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.
}

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

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;
 }

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

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

void someFunction() {
  char buf[BUFF_SIZE+1];
  fillMyBuffer(buf, BUFF_SIZE);
  doSomethingWithMyBuffer(buf);
}

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