Как передать в dll двумерный массив?

 

Сабж.


Интересует именно представление массива в памяти и корректное обращение.

Буду премного благодарен за объяснение и еще больше за пример кода.

 
TheXpert писал(а) >>

Сабж.

Интересует именно представление массива в памяти и корректное обращение.

Буду премного благодарен за объяснение и еще больше за пример кода.

Что разве котировки никогда не передавали в DLL? Там как раз многомерный. :) Примеров море. См. Образец кода для вызова DLL.

 
SProgrammer >>:

Что разве котировки никогда не передавали в DLL? Там как раз многомерный. :) Примеров море. См. Образец кода для вызова DLL.

Не уверен, что котировки хранятся в виде двумерного массива. Примера именно с двумерным массивом нетуть. Неужели думаете, я не смотрел? Первым делом.

 
MT4_EXPFUNC void __stdcall Load_Data(double *INPUT_DATA, double *OUTPUT_DATA) 
{
   // INPUT_DATA[Dim_1][Dim_2]:  Dim_1 - Измерение примеров в выборке, Dim_2 - Измерение входов =  NUM_INP
   // OUTPUT_DATA[Dim_1][Dim_2]: Dim_1 - Измерение примеров в выборке, Dim_2 - Измерение выходов = NUM_OUT
   for(int i=0;i<NN->num_pat;i++)
   for(int j=0;j<NN->num_inp;j++)
   {
      NN->input[j][i]=*INPUT_DATA;
      INPUT_DATA+=1;
   }
   for(int i=0;i<NN->num_pat;i++)
   for(int j=0;j<NN->num_out;j++)
   {
      NN->output[j][i]=*OUTPUT_DATA;
      OUTPUT_DATA+=1;
   }
}

Писал для НС... Указатель хоть и на одномерный массив, но он же всё равно является указателем на начало массива, который в МТ определён как 2-х мерный

в МТ функция выглядит вот так:

void     Load_Data(double& INPUT_DATA[][], double& OUTPUT_DATA[][]) ;
         // INPUT_DATA[Dim_1][Dim_2]:  Dim_1 - Измерение примеров в выборке, Dim_2 - Измерение входов = NUM_INP
         // OUTPUT_DATA[Dim_1][Dim_2]: Dim_1 - Измерение примеров в выборке, Dim_2 - Измерение выходов = NUM_OUT
Вобщем указатель проходит сначала по второму измерению
 
TheXpert писал(а) >>

Не уверен, что котировки хранятся в виде двумерного массива. Примера именно с двумерным массивом нетуть. Неужели думаете, я не смотрел? Первым делом.

Да надо просто глянуть в документацию. Двухмерный массив шесть даблов на число баров.

 
Просто передавайте и всё. В DLL отдаётся буфер, в котором хранятся данные. Буфер - непрерывный. Как Вы будете его интерпретировать - Ваше дело
 
StatBars >>:

Писал для НС... Указатель хоть и на одномерный массив, но он же всё равно является указателем на начало массива, который в МТ определён как 2-х мерный

Спасибо... Для динамических массивов то же самое или отличается? Или это именно для них?
 
stringo >>:
Просто передавайте и всё. В DLL отдаётся буфер, в котором хранятся данные. Буфер - непрерывный. Как Вы будете его интерпретировать - Ваше дело

На самом деле вопрос другой :) . Я так надеялся, что можно каким-нибудь хитрым макаром подменить указатель...

Кстати, строки в массиве можно хачить по ходу, т.е. подменять своими извне. Но строки как раз не нужны...

 
TheXpert писал(а) >>
Спасибо... Для динамических массивов то же самое или отличается? Или это именно для них?

В MQL все массивы динамические внутри. А при передаче в DLL передается его содержимое. Размер поменять нельзя. Делается такая фигня которая по научному называется маршилинг. Или преобразование параметров при передаче их из подобных, по сути менеджмент-сред в неменеджет - в нейтив.

 
TheXpert писал(а) >>
Спасибо... Для динамических массивов то же самое или отличается? Или это именно для них?

скорее всего также...

 
TheXpert писал(а) >>

На самом деле вопрос другой :) . Я так надеялся, что можно каким-нибудь хитрым макаром подменить указатель...

Кстати, строки в массиве можно хачить по ходу, т.е. подменять своими извне. Но строки как раз не нужны...

Указатель Вы подменить не сможете.

Причина обращения: