Массив double x[][] передается как double *.
Адресация одномерная, индексЭлемента = Строка*МАКС_СТОЛБЕЦ + Столбец
Просто передавайте и всё. В DLL отдаётся буфер, в котором хранятся данные. Буфер - непрерывный. Как Вы будете его интерпретировать - Ваше дело
Моя интерпретация такова, что это означает, что в Dll нельзя выполнять обращение к массиву в виде x[i][j], только x[i].
Собственно, я всегда пишу *(x + i).
А где неработающий код, для начала? :-)
это текст зловредной 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);
}
это текст зловредной 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);
}
class PDoubleWrapper
{
double * data;
int cols, rows;
double & operator(int line, int col) { ... }
};
Это намек...
Всем доброго времени суток!!!
Прошу всех не кидать в меня камни и не бить палками... ну это так...
В вопрос у меня вследующем: как в Делфовую 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
Во всяком случае здесь перегружать ничего не надо...
была тема наподобии, но суть в том же - передача 2D массива...
Сейчас ссылку даже не найду...
Вот и тема - 'Как передать в dll двумерный массив?'Не нужно искать- Вы в процитированном мною посту stringo нажмите стрелочку >>.
Это как раз из той темы.
Пример нормальный, только с Wrapper'ом массивы не надо никуда копировать...
У Вас в примере, между прочим, целевой массив- фиксированный.
Не нужно искать- Вы в процитированном мною посту stringo нажмите стрелочку >>.
Это как раз из той темы.
Пример нормальный, только с Wrapper'ом массивы не надо никуда копировать...
У Вас в примере, между прочим, целевой массив- фиксированный.
Этот пост я прочитал не один раз https://forum.mql4.com/ru/23990
не работает....
Тем не менее за ссылку благодарю.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем доброго времени суток!!!
Прошу всех не кидать в меня камни и не бить палками... ну это так...
В вопрос у меня вследующем: как в Делфовую dll передавать массивы рамерностью больше 1???
Вросмотрел все примеры, перелазил весь форум (как мне показалось) но результат один: терминал вытелает
при попытке передать в dll любой массив более чем x[]. Массив x[][] вызывает панику у терминала.
Заранее благодарен всем!!!