передача массивов через функцию возвращает неправильные значения

Я пытаюсь использовать значения массива в какой-то другой функции, но когда я возвращаю данные через функцию, содержимое оказывается неверным.

Это файл внешней функции, который я пытаюсь использовать

#include "Arrayreturner.h"

Arrayreturner::Arrayreturner() { }

void Arrayreturner::setResults(int* res, int size) {
 int temp[size];

 for(int i=0;i<size;i++) {
  temp[i] = res[i];
 }

 results = temp;

}

int* Arrayreturner::getResults() {
  return results;
}

Это заголовочный файл

#ifndef ARRAYRETURNER_H
#define ARRAYRETURNER_H

#include <Arduino.h>
#include <Wire.h>

class Arrayreturner {
public: // сначала некоторые публичные определения

 Arrayreturner();

void setResults(int* res, int size);
int* getResults();
int* results;

};


#endif

А вот и основная программа

#include <Arduino.h>
#include "Arrayreturner.h"

Arrayreturner data;

void setup() {
 Serial.begin(9600);

}

int* returnArray(int arr[]) {
 // int arr[] = { 3, 5, 6, 7, 9 };
 int *p = arr;

 // Serial.print("rA: ");
 // for(int i=0;i<5;i++) {
 //   Serial.print(p[i]); Serial.print(" ");
 // } Serial.println("");
 return p;
}

Arrayreturner testfunc() {
 Arrayreturner data;
 int arr[] = { 2,4,6,8,10};

 data.setResults(arr, 5);

 return data;
}

void loop() {

  int arr[] = { 3, 5, 6, 7, 9 };
  // int *p = arr;
  // int (*ptr)[5] = &arr;

 // Serial.print("p: ");
 // for(int i=0;i<5;i++) {
 //   Serial.print(p[i]); Serial.print(" ");
 // } Serial.println("");

 // int* p1;
 // p1 = returnArray(arr);
 // Serial.print("p1: ");
 // for(int i=0;i<5;i++) {
 //   Serial.print(p1[i]); Serial.print(" ");
 // } Serial.println("");

 // data.setResults(arr, 5);

 // int* res = data.getResults();
 //
 // Serial.print("res: ");
 // for(int i=0;i<5;i++) {
 //   Serial.print(res[i]); Serial.print(" ");
 // } Serial.println(" ");

 Arrayreturner ar = testfunc();
 int* res = ar.getResults();
 Serial.print("res: ");
 for(int i=0;i<5;i++) {
   Serial.print(res[i]); Serial.print(" ");
 } Serial.println(" ");

 Serial.println("--------------");



  delay(2000);

}

Возможно, что-то не так с объявлением указателя, но я не могу понять, что именно.

Спасибо за помощь

, 👍0


2 ответа


Лучший ответ:

0

Это вопрос по языку C. Вы копируете локальный массив, созданный в стеке testfunc(), в другой массив, созданный в стеке Arrayreturner::setResults(). Затем вы сохраняете указатель на второй массив в переменной-члене results. Но этот указатель недействителен, когда функция setResults() возвращает значение, и массив в стеке уничтожается.

Обычный способ — создать массив, передать его в качестве параметра функции и позволить функции заполнить его.

,

Я добавил свою собственную переменную (Arrayreturner) перед вызовом "testfunc" и передал ее через вызываемые функции. Массив и другие переменные Arrayreturner теперь показывают правильные значения. Спасибо, @v3xX


0

Ваши массивы объявляются локально в функциях. Вы не можете вернуть локальные массивы из функции — как только вы возвращаете, массивы больше не существуют.

,