返回完整数组 C++?
Returning full array C++?
我正在尝试 print/return 下面代码中的数组列表,但收到有关无效转换的错误消息。经过一些研究,似乎在 C++ 中一次打印所有数组是不可能的,但必须在单个字母的 for 循环中打印。我会简单地这样做,但我也读到一个 return 命令使计算机直接脱离功能,所以我认为我无法 return 单个字母。
非常感谢任何关于如何最好地做到这一点的指导,我请你记住,我充其量只是一个平庸的 python 编码员,很少使用 C++。
void setup()
{
Serial.begin(9600);
Serial.print(printletters());
}
void loop()
{
}
void printletters()
{
String wordsOfA = "BooffrOM";
int listum[]= {};
int listnumber=0;
char listy[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9','@','#','$','%'};
for (int k=0; k<wordsOfA.length(); k+=1) {
char let = toupper(wordsOfA[k]);
int wantedpos;
for (int j=0; j<40;++j) {
if (let == listy[j]) {
wantedpos = j;
listum[listnumber]=wantedpos;
listnumber=listnumber+1;
break;
}
}
}
Serial.print(listum);
return listum;
}
PS 为了便于阅读,我删除了很多代码中不相关的部分,如果您觉得这些部分可能是问题的一部分,请发表评论,我将 post 完整代码。
在 C/C++ 中,不只是 return 来自函数的数组。
当你在函数内部分配一个数组时,你不能 return 一个指向该数组中第一个元素的指针,因为当函数 returns 时,在该函数内部分配的所有局部变量都是擦干净了。
int* printLetters() {
int listum[];
return listum;
}
执行此操作时,指向数组 listum
中第一个元素的指针是从函数中 return 编辑的。如果您知道数组中有多少个元素,则可以遍历并偏移 returned 指针以打印每个元素。
你可以这样做,如果不是因为当你从一个函数 return 任何堆栈分配的局部变量都被销毁或清除干净时,你可以这样做,所以你 return 是一个无效的指针.这是因为这些变量存储在函数调用堆栈中。当一个新函数被调用时,变量被压入栈顶,当该函数被 returned 时,变量被弹出栈。
return从函数中获取数组的主要方法有两种。第一个是堆分配动态数组,使用 malloc()
或 new
。堆是堆栈之外的内存区域,因此可以在堆内手动分配变量,但您还必须手动释放该变量,否则会发生内存泄漏。
int* returnArray() {
int* arrayPointer = malloc(3 * sizeof(int));
arrayPointer[0] = 42;
arrayPointer[1] = 32;
arrayPointer[2] = 74;
return arrayPointer;
}
int main() {
int* returnedArray = returnArray();
for (int i = 0; i < 3; ++i) {
printf("%i\n", returnedArray[i]);
}
free(returnedArray);
}
在此示例中,我们使用 malloc()
在堆中手动创建三个整数,然后填充分配的整数,并 return 指向第一个整数的指针。然后在主函数中我们遍历这三个整数,并打印每个元素。然后我们需要手动释放这三个整数,因为我们手动分配了它们。
第二种方法是在调用函数中创建一个数组,并将指向该数组的指针传递给被调用函数。
void returnArray(int(*arrayPointer)[3]) {
(*arrayPointer)[0] = 42;
(*arrayPointer)[1] = 32;
(*arrayPointer)[2] = 74;
}
int main() {
int myArray[3];
returnArray(&myArray);
for (int i = 0; i < 3; ++i) {
printf("%i\n", myArray[i]);
}
}
这里我们不需要释放数组,因为它是在调用函数中自动分配的。我们没有手动分配它。
如果看不懂,或许您可以观看以下视频:
- https://www.youtube.com/watch?v=EDy8BmAW3uo
- https://www.youtube.com/watch?v=olmdY-omkqg
- https://www.youtube.com/watch?v=RWNM7CzDNyY
- https://www.youtube.com/watch?v=_8-ht2AKyH4
我会推荐你观看这个播放列表:
如果您想 'return' 基本上是函数中的一个字符串,您将不得不动态分配一个内存块,用字母和 return 该块的地址填充它。但实际上最好为函数提供一个字符串缓冲区指针,这样函数就会将字母复制到该缓冲区。缓冲区本身可以动态分配,也可以静态分配
有一些代码:
#include <string.h>
int CopyString(char* out_buf, int buf_size) {
const char* str = "Hello, world!";
int write_count = strlen(str);
if (write_count > buf_size - 1)
write_count = buf_size - 1;
for (int i = 0; i < write_count; i++) {
out_buf[i] = str[i];
}
out_buf[write_count] = '[=10=]';
return write_count;
}
// how to use
int main() {
char buffer[256];
int string_length = CopyString(buffer, 256);
}
我正在尝试 print/return 下面代码中的数组列表,但收到有关无效转换的错误消息。经过一些研究,似乎在 C++ 中一次打印所有数组是不可能的,但必须在单个字母的 for 循环中打印。我会简单地这样做,但我也读到一个 return 命令使计算机直接脱离功能,所以我认为我无法 return 单个字母。
非常感谢任何关于如何最好地做到这一点的指导,我请你记住,我充其量只是一个平庸的 python 编码员,很少使用 C++。
void setup()
{
Serial.begin(9600);
Serial.print(printletters());
}
void loop()
{
}
void printletters()
{
String wordsOfA = "BooffrOM";
int listum[]= {};
int listnumber=0;
char listy[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9','@','#','$','%'};
for (int k=0; k<wordsOfA.length(); k+=1) {
char let = toupper(wordsOfA[k]);
int wantedpos;
for (int j=0; j<40;++j) {
if (let == listy[j]) {
wantedpos = j;
listum[listnumber]=wantedpos;
listnumber=listnumber+1;
break;
}
}
}
Serial.print(listum);
return listum;
}
PS 为了便于阅读,我删除了很多代码中不相关的部分,如果您觉得这些部分可能是问题的一部分,请发表评论,我将 post 完整代码。
在 C/C++ 中,不只是 return 来自函数的数组。
当你在函数内部分配一个数组时,你不能 return 一个指向该数组中第一个元素的指针,因为当函数 returns 时,在该函数内部分配的所有局部变量都是擦干净了。
int* printLetters() {
int listum[];
return listum;
}
执行此操作时,指向数组 listum
中第一个元素的指针是从函数中 return 编辑的。如果您知道数组中有多少个元素,则可以遍历并偏移 returned 指针以打印每个元素。
你可以这样做,如果不是因为当你从一个函数 return 任何堆栈分配的局部变量都被销毁或清除干净时,你可以这样做,所以你 return 是一个无效的指针.这是因为这些变量存储在函数调用堆栈中。当一个新函数被调用时,变量被压入栈顶,当该函数被 returned 时,变量被弹出栈。
return从函数中获取数组的主要方法有两种。第一个是堆分配动态数组,使用 malloc()
或 new
。堆是堆栈之外的内存区域,因此可以在堆内手动分配变量,但您还必须手动释放该变量,否则会发生内存泄漏。
int* returnArray() {
int* arrayPointer = malloc(3 * sizeof(int));
arrayPointer[0] = 42;
arrayPointer[1] = 32;
arrayPointer[2] = 74;
return arrayPointer;
}
int main() {
int* returnedArray = returnArray();
for (int i = 0; i < 3; ++i) {
printf("%i\n", returnedArray[i]);
}
free(returnedArray);
}
在此示例中,我们使用 malloc()
在堆中手动创建三个整数,然后填充分配的整数,并 return 指向第一个整数的指针。然后在主函数中我们遍历这三个整数,并打印每个元素。然后我们需要手动释放这三个整数,因为我们手动分配了它们。
第二种方法是在调用函数中创建一个数组,并将指向该数组的指针传递给被调用函数。
void returnArray(int(*arrayPointer)[3]) {
(*arrayPointer)[0] = 42;
(*arrayPointer)[1] = 32;
(*arrayPointer)[2] = 74;
}
int main() {
int myArray[3];
returnArray(&myArray);
for (int i = 0; i < 3; ++i) {
printf("%i\n", myArray[i]);
}
}
这里我们不需要释放数组,因为它是在调用函数中自动分配的。我们没有手动分配它。
如果看不懂,或许您可以观看以下视频:
- https://www.youtube.com/watch?v=EDy8BmAW3uo
- https://www.youtube.com/watch?v=olmdY-omkqg
- https://www.youtube.com/watch?v=RWNM7CzDNyY
- https://www.youtube.com/watch?v=_8-ht2AKyH4
我会推荐你观看这个播放列表:
如果您想 'return' 基本上是函数中的一个字符串,您将不得不动态分配一个内存块,用字母和 return 该块的地址填充它。但实际上最好为函数提供一个字符串缓冲区指针,这样函数就会将字母复制到该缓冲区。缓冲区本身可以动态分配,也可以静态分配
有一些代码:
#include <string.h>
int CopyString(char* out_buf, int buf_size) {
const char* str = "Hello, world!";
int write_count = strlen(str);
if (write_count > buf_size - 1)
write_count = buf_size - 1;
for (int i = 0; i < write_count; i++) {
out_buf[i] = str[i];
}
out_buf[write_count] = '[=10=]';
return write_count;
}
// how to use
int main() {
char buffer[256];
int string_length = CopyString(buffer, 256);
}