Совет 1: Как передать массив в функцию

Массивы являются одной из наиболее интенсивно используемых форм структурированного хранения данных в программах для ЭВМ. Их обработка может производиться различными алгоритмами, реализованными в методах классов и функциях. Соответственно, часто требуется передать массив в функцию. Большую свободу в выборе способов совершения данного действия предлагают языки C и C++.
Как передать массив в функцию
Вам понадобится
  • - компиляторы языков C и C++.
Инструкция
1
Передайте в функцию массив фиксированного размера. Прототип функции измените таким образом, чтобы он содержал аргумент соответствующего типа. Например, декларация функции, принимающей в качестве параметра массив целых числовых значений из трех элементов, может выглядеть следующим образом:

void ArrayFunction(int aNumbers[3]);


Вызов такой функции осуществляется путем передачи ей непосредственно массива в качестве аргумента:

void SomeFunction()
{
    int aNumbers[] = { 1, 2, 3 };
    ArrayFunction(aNumbers);
}


Передаваемые данные копируются в стек. Модификация массива в вызываемой функции не приводит к изменению источника.
2
Передавайте в функцию массивы переменной длины. Для этого просто не специфицируйте размерность соответствующего аргумента:

void ArrayFunction(int aNumbers[]);


Многомерные массивы также можно передавать подобным образом (переменным может быть только первое «измерение»):

void ArrayFunction(int aNumbers[][3][2]);


Вызов подобных функций производится тем же образом, что и в первом шаге.

Для того чтобы иметь возможность корректно обрабатывать массивы переменной длины в функции, необходимо либо явно передавать количество их элементов через дополнительный параметр, либо использовать соглашения, накладывающие ограничения на значения самих элементов (определенное значение должно являться признаком конца массива).
3
Передайте массив по указателю. Аргументом функции должен являться указатель на значение с типом, соответствующим элементам массива. Например:

void ArrayFunction(int *pNumbers);


Доступ к данным в функции может осуществляться как в нотации работы с элементами массива, так и при помощи адресной арифметики:

void ArrayFunction(int *pNumbers)
{
    pNumbers[0] = 10; // доступ к элементу 0
    *(pNumbers + 1) = 20; // доступ к элементу 1
}


Будьте внимательны! Поскольку в функцию передается не копия данных, а указатель на них, модификации будет подвергнут исходный массив.

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

void SomeFunction()
{
    int aNumbers[] = { 1, 2, 3 };
    ArrayFunction(aNumbers); // весь массив
    ArrayFunction(&aNumbers[1]); // начиная со второго элемента
}


Данный способ также обычно предполагает передачу количества доступных элементов в дополнительном параметре или использование признака конца массива.
4
Осуществите передачу данных в функцию с параметром, являющимся объектом или ссылкой на объект класса, реализующего функционал массива. Подобные классы или шаблоны классов обычно входят в состав популярных библиотек и фреймворков (QVector в Qt, CArray в MFC, std::vector в STL, и т.д.).

Часто данные классы реализуют стратегию неявного совместного использования данных (implicit data sharing) с подсчетом ссылок (reference counting), выполняя глубокое копирование только при модификации данных (copy on write). Это позволяет минимизировать потребление вычислительных ресурсов даже в случае передачи объектов массивов по значению через аргументы функций и методов:

void ArrayFunction(QVector oArray)
{
    int nItemCount = oArray.count();
    int nItem = oArray[0];
}
 
void SomeFunction()
{
    QVector oArray(10);
 
    for(int i = 0; i
Видео по теме

Совет 2 : Как вернуть массив

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

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

Поименованная совокупность однотипных данных, называемая массивом, широко используется в различных языках программирования. С помощью массива значительно облегчается работа с данными, обеспечивается структурированность программного кода. Функции в языках также имеют огромное значение, позволяя выполнять узконаправленную задачу в любом месте кода, без ее повторной реализации. При этом часто возникает необходимость использования данных одного массива как в функции, так и в других блоках кода. Возвращение массива из функции может быть реализовано несколькими способами.
Как вернуть массив из функции
Инструкция
1
В языке программирования С++ непосредственный возврат массива из функции непредусмотрен, данную задачу можно решить с помощью передачи указателя на массив данных. Для этого при объявлении используемой функции пропишите ей в качестве возвращаемого значения указатель на тип данных, массив которых планируется передавать.
Пример кода программы на языке С++, реализующий возврат данных массива по указателю:
class СHelp
{
private:
int m_data[4];
public:
fDebit()
{
m_data[0]=42;
m_data[1]=56;
}
int *returnArray() // объявление и описание функции
{
return m_data;
}
};
void main()
{
int *m_dataA;
СHelp *ohelp=new СHelp();

m_dataA=ohelp->returnArray(); // возврат массива класса
}
Однако следует иметь в виду, что подобный возврат возможен лишь в рамках одного класса. Если требуется использовать обычную функцию в коде программы, аналогичная передача данных через указатель будет некорректной и может выполняться с ошибкой. Это связано с областью видимости переменных. При создании массива в самой функции он не будет виден за ее пределами.
2
В случае необходимости передачи массива из локальной функции следует воспользоваться следующим вариантом. Сформируйте массив в основном коде программы. Объявите функцию с параметрами, первым из которых будет константный указатель на тип данных массива, второй – обычный указатель того же вида. При вызове функции передайте в качестве первого и второго параметра один и тот же адрес созданного массива. Работу с данными в функции осуществляйте с первым полученным указателем, а все изменения записывайте по указателю второго. Таким образом, по завершении функции вы получите результаты его работы в массиве по второму указателю.
Пример объявления такой функции:
void my_funk_1(const double* in, doble* out);
3
Используйте реализованный класс std::auto_ptr, решающий задачу передачи указателя из функции без ошибок с областью видимости переменных.
Пример кода программы:
include
include
int[] Аrr_f2(int count) // описание функции
{
return new int[count];
}
void main()
{
std::auto_ptr ptr(Аrr_f2(20)); // вызов функции и возврат ею массива
cout
4
В языке программирования FoxPro возврат функции можно реализовать похожим способом, обращаясь к ранее созданному массиву.
Пример кода на языке FoxPro:
LOCAL mas(2)
=func_2(@f3)
?mas(15)
?mas(20)
FUNCTION func_2(mas)
EXTERNAL ARRAY mas
mas(1)=1
mas(2)=2
RETURN
ENDFUNC
5
Скриптовый язык AutoIt позволяет вернуть массив из функции, используя стандартные конструкции и оператор Return.
Пример кода на языке AutoIt:
#include
$Rez = func_3()
$aRezultat=StringSplit($Rez,'|')
Func func_3()
$aRet= 15 & '|' & 40
Return $aRet // возврат массива aRet из функции
EndFunc
Видео по теме
Совет полезен?
Поиск
Добавить комментарий к статье
Осталось символов: 500