Присвоение массиву данных массива данных, возвращенных функцией

Alexey198
Offline
Зарегистрирован: 23.09.2013

Здравствуйте.

Возникла проблема.

Мне необходимо использовать несколько байтовых массивов, каждый из которых образуется своей функцией (в примере func_1()). Далее в новой функции (func_2 ()) вызывается каждая из функций (func_1 ()) возвращающих массив (mass_1).

Вопрос: Как мне присвоить массиву данных (mass_2) массив (mass_1), возвращаемый функцией (func_1 ()), без объявления массивов в глобальных переменных.

byte* func_1 () {
  byte mass_1 [10];

  for (int i=0; i<10; i++) {
    mass_1 [i]=i;
  }
  return mass_1;
}

void func_2 () {
  byte mass_2 [10]=func_1 () ;  
}

void setup() {
  func_2 () ;
}

 

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

По какой причине нельзя использовать глобальные массивы?

UPD: Возврат указатель на локальную переменную - море проблем, потому что она на то и локальная, что область видимости у неё, в данном случае, внутри функции.

 

leshak
Offline
Зарегистрирован: 29.09.2011

Немного неверный подход.

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

Вообщем "фигня выйдет" или "будет работать, но чисто на везении. в любой момент может скрешится".

Тут можно попробовать несколько решений.

1. Объявить mass_1 как static (что-бы он не "освобождался" при выходе из функции). А в функции func_2, не присваивать mass_2=func_1(), а воспользоваться memcpy()

2. Внутри func_1 выделять память под массив не с помощью "объявления массива", а с помощью функции malloc(). Но тогда нужно не забывать освообождать эту память когда она перестала требоватся. Например в конце func_2() не забыть вызвать free() для этого указателя (память выделенная с помощью malloc() сама не освоободится пока мы явно не скажем "касса свобода"),

3. Вообще внутри func_1 не выделять память. Передавать ей массив "снаружи", в качестве параметра, а она этот массив должна заполнить правильными значениями. Возвращать - она вообще ничего не будеть. Вообщем переименовать func_1() в fillArray(byte arrayToFill)

 

Alexey198
Offline
Зарегистрирован: 23.09.2013

kisoft пишет:

По какой причине нельзя использовать глобальные массивы?

Массивов, как mass_1 будет много и они будут в несколько раз длинее, хотя и все байтовые.

Они "съедят" много оперативки. А у меня есть еще куча функций, которые работают с большими переменными и массивами.

 

Alexey198
Offline
Зарегистрирован: 23.09.2013

leshak пишет:

Немного неверный подход.

1. Объявить mass_1 как static (что-бы он не "освобождался" при выходе из функции). А в функции func_2, не присваивать mass_2=func_1(), а воспользоваться memcpy()

2. Внутри func_1 выделять память под массив не с помощью "объявления массива", а с помощью функции malloc(). Но тогда нужно не забывать освообождать эту память когда она перестала требоватся. Например в конце func_2() не забыть вызвать free() для этого указателя (память выделенная с помощью malloc() сама не освоободится пока мы явно не скажем "касса свобода"),

Можете написать код по этим двум вариантам, чтобы было понятнее?

Заранее благодарен

leshak пишет:

3. Вообще внутри func_1 не выделять память. Передавать ей массив "снаружи", в качестве параметра, а она этот массив должна заполнить правильными значениями. Возвращать - она вообще ничего не будеть. Вообщем переименовать func_1() в fillArray(byte arrayToFill)

Для чего переименовывать?

Alexey198
Offline
Зарегистрирован: 23.09.2013

Наиболее всего подошел 3-й вариант.

leshak пишет:

3. Вообще внутри func_1 не выделять память. Передавать ей массив "снаружи", в качестве параметра, а она этот массив должна заполнить правильными значениями. Возвращать - она вообще ничего не будеть. Вообщем переименовать func_1() в fillArray(byte arrayToFill)

Вот его раелизация:

void func_1 (mass_1[], number_of_elemts) { /* number_of_elemts - количество элементов в массиве mass_1 */
  for (int i=0; i<number_of_elemts; i++) {
    mass_1[i]=i;
  }
}

void func_2 () {
  byte mass_2[10];

  func_1(mass_2, 10);
}

void setup () {
 func_2();
}