передача массивов через функцию возвращает неправильные значения
Я пытаюсь использовать значения массива в какой-то другой функции, но когда я возвращаю данные через функцию, содержимое оказывается неверным.
Это файл внешней функции, который я пытаюсь использовать
#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);
}
Возможно, что-то не так с объявлением указателя, но я не могу понять, что именно.
Спасибо за помощь
@v3xX, 👍0
2 ответа
Лучший ответ:
Это вопрос по языку C. Вы копируете локальный массив, созданный в стеке testfunc(), в другой массив, созданный в стеке Arrayreturner::setResults(). Затем вы сохраняете указатель на второй массив в переменной-члене results. Но этот указатель недействителен, когда функция setResults() возвращает значение, и массив в стеке уничтожается.
Обычный способ — создать массив, передать его в качестве параметра функции и позволить функции заполнить его.
Ваши массивы объявляются локально в функциях. Вы не можете вернуть локальные массивы из функции — как только вы возвращаете, массивы больше не существуют.
- Работает с gcc, но не с Arduino. ошибка: taking address of temporary array
- Передача массивов, глобальных массивов внутри функций, указателей и объявление размеров массивов.
- Установка указателя массива на null при объявлении
- Почему я не могу получить размер массива указателей
- Передача двумерного массива в функцию
- Поменять местами два массива (используя указатели, а не копирование)
- Можно ли создать массив для функций?
- Создание массива структур, в которых хранятся растровые изображения для работы с u8glib.
Я добавил свою собственную переменную (Arrayreturner) перед вызовом "testfunc" и передал ее через вызываемые функции. Массив и другие переменные Arrayreturner теперь показывают правильные значения. Спасибо, @v3xX