Как передать второе измерение двумерного массива по ссылке в функцию? - страница 2

 
Alexey Volchanskiy:

два варианта

1. Создать одномерный с нужной размерностью и в 2-х вложенных циклах перекинуть в него содержимое

2. Провести эксперимент - передавать двумерный, а принять как одномерный. Просто я не знаю, как там  адресацией элементов. Это 5 минут проверить. И вообще, скомпилируется ли такой трюк.

1 вариант не подходит, потому что это скорость и это к сожалению долго. А вот второй вариант у меня и вопрос, как оно считать будет, но по ходу не правильно если делать просто так в лоб. 

 

У Вас оба измерения массива неизвестны?

MQL производит большинство операций с одномерными.

Не помню уже, но такое вроде бы передавалось:

test[i,5]

//не утверждаю, попробуйте

Как вариант - формируйте массив в функции

Еще вариант:  массив не обязательно передавать в большинстве случаев, чаще достаточно передать индекс, и обратиться к созданному массиву в теле программы, уже внутри функции по индексу
 

Лично я не люблю всех этих многомерных массивов.

Но если надо - обычно делаю специальный класс, и потом - просто передаю указатель на объект.

 
Постников Артем:

Прошу подсказать, как в функцию передать второе измерение двумерного массива в функцию (одномерный массив) и инициализировать его?

#property strict

double arr[][2];

void InitArray(double& a[][], int size)
{
   ArrayResize(a, size);
   for (int i = 0; i < size*2; i++)
   {
      a[i / 2][i % 2] = i;
   }
}

void OnStart()
{
   InitArray(arr, 5);
   string s = "";
   int size = ArrayRange(arr, 0);
   for (int i = 0; i < size; i++)
   {
      s += arr[i][0];
   }
   Print(s);
   s = "";
   for (int i = 0; i < size; i++)
   {
      s += arr[i][1];
   }
   Print(s);
}
 
Alexey Viktorov:

Разве перегрузка функций это не относится к ООП?

Ну нет конечно.
 
TheXpert:

Смотрите у меня функция имеет такую сигнатуру void InitArray(double& a[]), как в неё передать массив, который по определению double arr[][], вообще возможно это сделать? Чтобы обрабатывать к примеру внутри функции arr[0][], arr[1][], каторые по сути своей уже одномерны. Сигнатуру функции нельзя менять.

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

ну вот как прописать параметр, чтобы передался именно одномерный (второе измерение) двухмерного массива, arr[0][] будет же неправильно?

 
а так вообще нельзя )
 
TheXpert:
а так вообще нельзя )

Просто на С это делается, а на MQL4 нереально такое?


С код:

Универсальный подход. Это интерпретировать любой двумерный массив, как одномерный, и передавать значения размеров каждой размерности массива.

Например,

void f( int a[], size_t m, size_t n );



//...



int A[3][4];



f( reinterpret_cast<int *>( A ), 3, 4 );    

Вот демонстрационная программа



#include <iostream>

#include <iomanip>



void f( int a[], size_t m, size_t n )

{

    for ( size_t i = 0; i < m; i++ )

    {

        for ( size_t j = 0; j < n; j++ ) a[i * n + j ] = i * n + j;

    }

}    



int main()

{

    const size_t M = 3;

    const size_t N = 4;

    int a[M][N];



    f( reinterpret_cast<int *>( a ), M, N );



    for ( size_t i = 0; i < M; i++ )

    {

        for ( size_t j = 0; j < N; j++ ) std::cout << std::setw( 2 ) << a[i][j] << ' ';

        std::cout << std::endl;

    }        



    return 0;

}