gpt4 book ai didi

c++ - 如何在arduino上使函数返回字符串?

转载 作者:太空狗 更新时间:2023-10-29 23:50:58 27 4
gpt4 key购买 nike

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

最佳答案

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

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 返回时,它的缓冲区不再占用内存,并且我的程序中没有一个函数具有占用空间的静态缓冲区,这些空间可能很少使用。

关于c++ - 如何在arduino上使函数返回字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24883961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com