Как вернуть массив из функции

dimquea
Offline
Зарегистрирован: 13.12.2015

Есть функция с одним входным int параметром.

Внутри фукнции деалется математика и получаются две int переменные, speedA и speedB.

Хотел вернуть массив, но на:

int speedArr[2] = {speedA,speedB};
return speedArr;

компилятор ругается: invalid conversion from 'int*' to 'int' [-fpermissive]

Как правильно вернуть их из функции?

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Проверьте объявление функции. У вас не совпадает тип возвращаемого значения.

dimquea
Offline
Зарегистрирован: 13.12.2015

Gippopotam пишет:

Проверьте объявление функции. У вас не совпадает тип возвращаемого значения.

я полагаю int должно быть?

Sindbad
Offline
Зарегистрирован: 08.12.2015

Цитата:

я полагаю int должно быть?

Нет, должно быть

int *

т.е. указатель на int.

Другое дело, что массив объявленный внутри функции, при выходе из функции перестает существовать. И использовать полученный указатель для доступа к уже не существующим переменным несколько экстремально.

Такие массивы надо объявлять через malloc(), не так как у Вас.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Проще передать указатель на массив вторым параметром и разделаться с ним любым способом.

 

Logik
Offline
Зарегистрирован: 05.08.2014

И не передавайте из функции указатель на массив обявленный в ней. Это злобная ошибка! Обявите массив хотябы там, откуда вызываете функцию, передайте ей в параметре указатель на массив, в функции заполните значения в массиве. 

Piskunov
Offline
Зарегистрирован: 13.02.2014

Понятный для понимания, не достойный для повторения, однако работающий способ:

int Arr[2] = {3, 4};
void setup() {
  Serial.begin (9600);
  calc (Arr);
  Serial.println(Arr[0]);
  Serial.println(Arr[1]);
}
void loop() {
}
void calc (int Brr[]){
  Brr[0] = 5;
  Brr[1] = 6;
  return;
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А почему недостойный для повторения?

Piskunov
Offline
Зарегистрирован: 13.02.2014

А потому что использует указатель по сути, но не по форме.

И вносит сумбур в восприятие переменных, передаваемых функции. Простые типы не будут претерпевать изменения, а массивы - будут.

Да и массив в этом случае лучше использовать очень маленький, а то другим переменным места не хватит ))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Опять не понял.

Piskunov пишет:

Да и массив в этом случае лучше использовать очень маленький, а то другим переменным места не хватит ))

Это относится к приведенному скетчу?

к Ардуино в целом?

просто шутка?

Piskunov
Offline
Зарегистрирован: 13.02.2014

andriano пишет:

Опять не понял.

Не верю! ©

andriano пишет:

к Ардуино в целом?

просто шутка?

Да, Вы правы.

Это очень тонкая шутка - использование C++ для Arduino. ))

gregoryl
Offline
Зарегистрирован: 09.09.2013

Дешево и очень сердито для вашей задачи

bool fn( int x, int & speedA, int & speedB )
{
    ......
    return true;
}

Вызываем так 

int a,b;

if( fn( 25, a, b ) )
{
  ....
}