Присвоение массиву данных массива данных, возвращенных функцией
- Войдите на сайт для отправки комментариев
Пнд, 23/09/2013 - 10:10
Здравствуйте.
Возникла проблема.
Мне необходимо использовать несколько байтовых массивов, каждый из которых образуется своей функцией (в примере 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 () ; }
По какой причине нельзя использовать глобальные массивы?
UPD: Возврат указатель на локальную переменную - море проблем, потому что она на то и локальная, что область видимости у неё, в данном случае, внутри функции.
Немного неверный подход.
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)
По какой причине нельзя использовать глобальные массивы?
Массивов, как mass_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)
Для чего переименовывать?
Наиболее всего подошел 3-й вариант.
3. Вообще внутри func_1 не выделять память. Передавать ей массив "снаружи", в качестве параметра, а она этот массив должна заполнить правильными значениями. Возвращать - она вообще ничего не будеть. Вообщем переименовать func_1() в fillArray(byte arrayToFill)
Вот его раелизация: