Передача массива из библиотеки: какие бывают способы?

 
Собственно, сабж. Написал небольшую библиотеку на MQL4 для решения системы линейных уравнений. Естественно, на выходе должен быть вектор решения, т.е. массив (у меня это глобальный массив библиотеки _point[]). Для его передачи в вызывающий модуль не нашел ничего лучше, чем такой вариант:

double solution_component( int j )
{
   return ( _point[ j ]);
}

Эта функция, конечно, находится в модуле библиотеки и нужна исключительно для того, чтобы внешний мир смог узнать элементы массива _point[]. Чтобы вытянуть из библиотеки сам вектор, функция solution_component() вызывается в цикле внутри вызывающего модуля и заполняет компоненты объявленного в вызывающем модуле массива. Кто-нибудь знает способы поизячнее?

Навскидку приходит в голову вариант с установкой глобальных переменных терминала, в количестве, равном размерности вектора, и последующим считыванием их значений. А сколько глобальных переменных в терминале может быть по максимуму?

Кстати, при попытке создания вот такой библиотечной функции (копирование массива source[] размерности dimension в массив target[]):

void copy_source_to_target( double source[], double target[], int dimension )
{
    for ( int i = 0; i < dimension; i++ ) target[ i ] = source[ i ];
    return;
}

получается ругательство, типа "target: элементу массива нельзя присвоить значение". Можно ли эту функцию как-то модифицировать, чтобы она заработала?

Буду рад услышать интересные варианты.

P.S. Пардон, кажись, нашел функцию ArrayCopy(). То-то, помнится, недоуменно взирал на символ & в параметре... Надеюсь, это правильное решение.

P.P.S. И все-таки, и все-таки... В библиотеке FFT от klotа нашел такой заголовок:

void fastfouriertransform(double& a[], int nn, bool inversefft)

В хелпе не нашел объяснения, что означает символ & в этом контексте. Судя по всему, это аналог Сишного синонима, который применяется к аргументам, передающимся по ссылке. Можно ли сделать вот так?

void copy_source_to_target( double source[], double& target[], int dimension )
{
    for ( int i = 0; i < dimension; i++ ) target[ i ] = source[ i ];
    return;
}
 
Я исключительно пользуюсь void Function(double& data). В вашем случае, для решения систем линейных уравнений, размер массива данных должен совпадать с размером массива для коэффициентов. Поэтому можно использовать один и тот же массив для передачи данных в функцию и передачи решений обратно в исходный модуль, типа void Function(double& iodata). Конечно можно и так: void Function(double inputdata, double& outputdata). Не думаю что существуют другие какие-то способы. Хотя интересно узнать мнения других.
 
gpwr писал (а):
Я исключительно пользуюсь void Function(double& data). В вашем случае, для решения систем линейных уравнений, размер массива данных должен совпадать с размером массива для коэффициентов. Поэтому можно использовать один и тот же массив для передачи данных в функцию и передачи решений обратно в исходный модуль, типа void Function(double& iodata). Конечно можно и так: void Function(double inputdata, double& outputdata). Не думаю что существуют другие какие-то способы. Хотя интересно узнать мнения других.
Это, мягко говоря, зкстремизм; приходится постоянно следить за сделанными изменениями, прежде чем передавать их обратно. Все изменения над исходным массивом распространяются на весь модуль, т.е. нарушается обоснованная локальность переменных в функциях. Экономия кода, мне кажется, таких мер не оправдывает. А другой способ я уже указал - функция ArrayCopy().

Конечно, так или иначе приходится идти на компромисс, жертвуя безопасностью кода, тут ничего не поделаешь...

gpwr, никак не могу найти ошибку в коде. Это функция ввода данных в матрицу непосредственно с текущего чарта:

void input_data( double& m[][] )
{
   int startbar = 100;
   
   for (       int row = 0;    row < _dimension;    row++ )
      for ( int column = 0; column < _dimension; column++ )
         m[ row ][ column ] = Close [ startbar - row - column ];
   
   for (           row = 0;    row < _dimension;    row++ )     
         m[ row ][ _dimension ] = High [ startbar - row - _dimension];
        
   return;     
}
При вызове этой функции я просто подставляю вместо формального параметр, объявленный как глобальный. Матрица не объявлена как буфер индикатора. А далее, при выводе этой матрицы в файл, я получаю нули. Что неправильно?

P.S. После явного указания обеих размерностей при объявлении матрицы все работает. Проблема в том, что эта размерность объявлена как внешний параметр, и ее нельзя указать как переменную. .. Можно сделать не слишком изячно: объявляем массив глобально с размерностями 50х50, а в функции init() первую размерность переделываем на нужное значение, которое обычно существенно меньше.

Вопрос разработчикам: можно ли расширить функцию ArrayResize() так, чтобы она могла изменить любую размерность массива, не только первую?
Причина обращения: