返回完整数组 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]);
    }
}

这里我们不需要释放数组,因为它是在调用函数中自动分配的。我们没有手动分配它。


如果看不懂,或许您可以观看以下视频:

我会推荐你​​观看这个播放列表:

如果您想 '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);
}