Как вернуть массив?
3 ноября 2014 г. Просмотров: 932
Массивы являются одной из простейших форм структурированного хранения данных. Поскольку под хранение одномерных массивов отводятся неделимые области памяти, и большинство языков программирования имеет синтаксические конструкции для их объявления, они интенсивно используются в качестве буферов для передачи больших объемов информации различным (в том числе и библиотечным) функциям. В свою очередь функциям иногда требуется вернуть массив. Верните данные из функции или метода, поместив их в массив фиксированной длины, распределенный вызывающей стороной и переданный по ссылке. Произведите определение соответствующего типа данных, например:typedef int t_array10[10];Используйте его в декларации и реализации нужной функции или метода:void ReturnArray(t_array10& raOut){ raOut[0] = 10;}Соответствующим образом осуществляйте вызов:int aNumbers[10];ReturnArray(aNumbers);Недостаток данного метода состоит в том, что длина массива фиксирована. Верните данные массива, поместив их в выходной буфер, распределенный вызывающей стороной и переданный по указателю. Прототип функции или метода может содержать параметр, объявленный как в нотации массива без спецификации размера:void ReturnArray(int anArray[], int nSize);так и в качестве указателя:void ReturnArray(int *pnArray, int nSize);В обоих случаях идентификатор параметра можно использовать в нотации массива:void ReturnArray(int *pnArray, int nSize){ for(nSize--; nSize > -1; pnArray[nSize] = nSize--);} // вызовint aNumbers[10];ReturnArray(aNumbers, sizeof(aNumbers) / sizeof(aNumbers[0]));Данный метод передачи массивов в функции и возврата данных массивов из них в подавляющем большинстве случаев используется при разработке программ на C. Обратите внимание на то, что функции и методы, принимающие и возвращающие данные подобным образом, как правило, должны иметь дополнительный параметр, через который передается реальный размер буфера. Верните массив, созданный в функции или методе. Формально в данном случае должен быть возвращен не массив, а указатель на его первый элемент:int* ReturnArray(){ int *pnArray = new int[10]; // работа с pnArray return pnArray;} // получение указателя на созданный массивint *pnNumbers = ReturnArray();// использованиеdelete [] pnNumbers; // удалениеИспользование данного метода сопряжено с некоторыми ограничениями. Так, массив должен быть расположен в динамически распределяемой памяти. Кроме того, его удаление необходимо совершить методом, соответствующим созданию (delete в случае использования new, free для malloc, и т.д.). Используйте классы контейнеров для того, чтобы удобно возвращать массивы при разработке программ на C++. Пример создания и возврата массива, являющегося объектом класса шаблона vector стандартной библиотеки шаблонов C++, специфицированного для int, может выглядеть так:#include std::vector ReturnArray(){ std::vector oArray; oArray.resize(10); oArray[0] = 100; oArray[1] = 200; return oArray;} std::vector oArray = ReturnArray();Обратите внимание на то, что большинство популярных фреймворков предоставляет мощные классы или шаблоны классов массивов. Зачастую они реализуют концепцию неявного разделения данных с подсчетом ссылок и копированием при записи. Поэтому возврат по значению подобных массивов из функций выполняется весьма эффективно и сопряжен с минимальным расходом вычислительных ресурсов.
Оцените статью!
Вам понадобится
- - текстовый редактор;
- - компилятор и линкер C или C++.