Массивы произвольной размерности в dll

 

Всем доброго времени суток!!!

Прошу всех не кидать в меня камни и не бить палками... ну это так...

В вопрос у меня вследующем: как в Делфовую dll передавать массивы рамерностью больше 1???

Вросмотрел все примеры, перелазил весь форум (как мне показалось) но результат один:  терминал вытелает

при попытке передать в dll любой массив более чем x[]. Массив x[][] вызывает панику у терминала.

Заранее благодарен всем!!!

 

Массив double x[][] передается как double *.

Адресация одномерная, индексЭлемента = Строка*МАКС_СТОЛБЕЦ + Столбец

 
jartmailru >>:

Массив double x[][] передается как double *.

Адресация одномерная, индексЭлемента = Строка*МАКС_СТОЛБЕЦ + Столбец


Возможно я уже сильно торможу, но можно чутьчку поподробнее.

Заранее благодарен.

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

Моя интерпретация такова, что это означает, что в Dll нельзя выполнять обращение к массиву в виде x[i][j], только x[i].

Собственно, я всегда пишу *(x + i).

А где неработающий код, для начала? :-)

 
jartmailru >>:

Моя интерпретация такова, что это означает, что в Dll нельзя выполнять обращение к массиву в виде x[i][j], только x[i]



мдам.... а все тах хорошо начиналось...
 
Debugger >>:


мдам.... а все тах хорошо начиналось...

class PDoubleWrapper

{

double * data;

int cols, rows;

double & operator(int line, int col) { ... }
};

Это намек...

 
Debugger >>:


мдам.... а все тах хорошо начиналось...


это текст зловредной dll:

unit Unit1;

interface

type
TInput = array of array of Real;

function TwoArr(NewParam: TInput): Double; stdcall;


exports
TwoArr;

implementation

function TwoArr(NewParam: TInput): Double;
var
I,J: integer;
X: Double;
begin
X:=0;
for I := 0 to 9 do
for J := 0 to 9 do
X:=X+ NewParam[I,J];
Result := X;
end;

end.
-------------------------------------------------------------------------------

а это текст проверочного скрипта:


#import "MT4Pegasus.dll"
double TwoArr(double InPattern[][10]);
#import

//ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
int MA[10] = {3, 5, 8, 13, 21, 34, 55, 89, 144, 233};
int InpRow = 10;
int InpCol = 10;
double Input[10][10];
double Inp[10];
string S;

int start()
{
GetQ();
if(IsLibrariesAllowed()==true)
{
int x=TwoArr(Input);
Alert(x);
}
else Alert("Невозможно вызвать функцию");
Alert("Скрипт закончил свою работу");
return(0);
}

//СЧИТЫВАНИЕ КОТИРОВОЧНЫХ ДАННЫХ
void GetQ()
{
for(int Row=0;Row<InpRow;Row++)
for(int Col=0;Col<InpCol;Col++)
Input[Row][Col]=iMA(NULL,0,MA[Row],0,MODE_EMA,PRICE_CLOSE,Col);
return(0);
}




 
Debugger >>:


это текст зловредной dll:

unit Unit1;

interface

type
TInput = array of array of Real;

function TwoArr(NewParam: TInput): Double; stdcall;


exports
TwoArr;

implementation

function TwoArr(NewParam: TInput): Double;
var
I,J: integer;
X: Double;
begin
X:=0;
for I := 0 to 9 do
for J := 0 to 9 do
X:=X+ NewParam[I,J];
Result := X;
end;

end.
-------------------------------------------------------------------------------

а это текст проверочного скрипта:


#import "MT4Pegasus.dll"
double TwoArr(double InPattern[][10]);
#import

//ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
int MA[10] = {3, 5, 8, 13, 21, 34, 55, 89, 144, 233};
int InpRow = 10;
int InpCol = 10;
double Input[10][10];
double Inp[10];
string S;

int start()
{
GetQ();
if(IsLibrariesAllowed()==true)
{
int x=TwoArr(Input);
Alert(x);
}
else Alert("Невозможно вызвать функцию");
Alert("Скрипт закончил свою работу");
return(0);
}

//СЧИТЫВАНИЕ КОТИРОВОЧНЫХ ДАННЫХ
void GetQ()
{
for(int Row=0;Row<InpRow;Row++)
for(int Col=0;Col<InpCol;Col++)
Input[Row][Col]=iMA(NULL,0,MA[Row],0,MODE_EMA,PRICE_CLOSE,Col);
return(0);
}




jartmailru >>:

class PDoubleWrapper

{

double * data;

int cols, rows;

double & operator(int line, int col) { ... }
};

Это намек...



Благодарю за идею...
 
Debugger писал(а) >>

Всем доброго времени суток!!!

Прошу всех не кидать в меня камни и не бить палками... ну это так...

В вопрос у меня вследующем: как в Делфовую dll передавать массивы рамерностью больше 1???

Вросмотрел все примеры, перелазил весь форум (как мне показалось) но результат один: терминал вытелает

при попытке передать в dll любой массив более чем x[]. Массив x[][] вызывает панику у терминала.

Заранее благодарен всем!!!

была тема наподобии, но суть в том же - передача 2D массива...

Сейчас ссылку даже не найду...

MT4_EXPFUNC void __stdcall Load_Data(double *INPUT_DATA, double *OUTPUT_DATA) 
{
    // INPUT_DATA[Dim_1][Dim_2]:  Dim_1 - Измерение примеров в выборке = NUM_PAT, Dim_2 - Измерение входов  = NUM_INP
    // OUTPUT_DATA[Dim_1][Dim_2]: Dim_1 - Измерение примеров в выборке = NUM_PAT, 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;
      }
}

Вот и тема - https://www.mql5.com/ru/forum/118727

Во всяком случае здесь перегружать ничего не надо...

 
StatBars >>:

была тема наподобии, но суть в том же - передача 2D массива...

Сейчас ссылку даже не найду...

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

Не нужно искать- Вы в процитированном мною посту stringo нажмите стрелочку >>.
Это как раз из той темы.
Пример нормальный, только с Wrapper'ом массивы не надо никуда копировать...

У Вас в примере, между прочим, целевой массив- фиксированный.

 
jartmailru >>:

Не нужно искать- Вы в процитированном мною посту stringo нажмите стрелочку >>.
Это как раз из той темы.
Пример нормальный, только с Wrapper'ом массивы не надо никуда копировать...

У Вас в примере, между прочим, целевой массив- фиксированный.


Этот пост я прочитал не один раз https://forum.mql4.com/ru/23990

не работает....

Тем не менее за ссылку благодарю.