С++ обмен данными с mql4

 

Здравствуйте. Пишу dll. Хочу пока отправить из мт4 одномерный массив получить в с++ преобразовать и обратно отправить в мт4. Пишу так на MQL4

#import "MyDll.dll"
double functionW1(double &Buffer1 );
#import
На с++ так
#define WIN32_LEAN_AND_MEAN  
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#define MT4_EXPFUNC __declspec(dllexport)
#pragma pack(push,1)
#pragma pack(pop)

MT4_EXPFUNC double __stdcall functionW1( double *Buffer1)
  {
double arr[121];
for (int i=0; i<=120;i=i+1)
{
 arr[i]=Buffer1[i]+0.1;
}   

   return  (*arr);
  }

массив arr не берет значения массива Buffer1 где ошибка?
 
elisseev2000:
массив arr не берет значения массива Buffer1 где ошибка?
а где передаваемый массив?
 

с индикатора

#property  indicator_chart_window 
#property indicator_buffers 5
#property indicator_color1 clrBlue
int Shift=24;
double Buffer1[];
double Buffer2[];
double Buffer3[];
double Buffer4[];
double Buffer5[];
#import "MyDll.dll"
double functionW1(double &Buffer1 );
#import
int init()
  {
SetIndexShift(0,Shift);
SetIndexStyle(0,DRAW_NONE);
SetIndexBuffer(0,Buffer1);
SetIndexBuffer(1,Buffer2);
SetIndexBuffer(2,Buffer3);
SetIndexBuffer(3,Buffer4);
SetIndexBuffer(4,Buffer5);
return(0);
  }
int start()
{
double arr[121];
for (int k=1;k<=121;k++)
{
Alert(functionW1(arr[k]),"  k= ",k);
}


for(int j1=1; j1<=121; j1++)
{
Buffer1[j1]=iClose(NULL,PERIOD_H1,j1*16-15);
Buffer2[j1]=iClose(NULL,PERIOD_H1,j1*8-7);
Buffer3[j1]=iClose(NULL,PERIOD_H1,j1*4-3);
Buffer4[j1]=iClose(NULL,PERIOD_H1,2*j1-1);
Buffer5[j1]=iClose(NULL,PERIOD_H1,j1); 
}

return(0);
}
 

Может вместо * надо &

 
#import "MyDll.dll"
double functionW1(double &Buffer1[]);
#import

и при вызове

functionW1(arr);


И не забыть пихнуть данные в arr перед вызовом functionW1.

 
elisseev2000:

Здравствуйте. Пишу dll. Хочу пока отправить из мт4 одномерный массив получить в с++ преобразовать и обратно отправить в мт4. Пишу так на MQL4

где ошибка? 

1. Попробуйте

#import "MyDll.dll"
double functionW1(double &Buffer[] );
#import

 2. Обратите внимание

На с++ так
#define WIN32_LEAN_AND_MEAN  
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#define MT4_EXPFUNC __declspec(dllexport)
#pragma pack(push,1)
#pragma pack(pop)

MT4_EXPFUNC double __stdcall functionW1( double *Buffer1)
  {
double arr[121];
for (int i=0; i<=120;i=i+1)
{
 arr[i]=Buffer1[i]+0.1;
}   

   return  (*arr);
  }

 На что следует обратить внимание:

1. Где (в какой области памяти) будет размещен массив  double arr[121];

2. Что произойдет с этой областью при завершении работы  функции MT4_EXPFUNC double __stdcall functionW1double *Buffer1) 

2. Куда будет указывать  *arr  после завершения работы функции MT4_EXPFUNC double __stdcall functionW1( double *Buffer1) - то есть, в тот момент, когда Вы его получите в МКЛ4  

И еще, ИМХО, не стоит возвращать указатели на память, размещенную в ДЛЛ, даже если это делать правильно - с учетом области видимости. Разместите память в МКЛ, передайте в ДЛЛ ссылку, заполните там и потом работайте в МКЛ

 
VladislavVG:

...не стоит возвращать указатели на память, размещенную в ДЛЛ, даже если Вы это делать правильно ...

 
tara:
Поправил,  прикольно получилось )))))))))
 
VladislavVG:
Поправил,  прикольно получилось )))))))))
:) 
 
RickD:

и при вызове


И не забыть пихнуть данные в arr перед вызовом functionW1.

Все так и делал. Если так написать индюк вабще не работает(((
 
VladislavVG:

1. Попробуйте

 2. Обратите внимание

 На что следует обратить внимание:

1. Где (в какой области памяти) будет размещен массив  double arr[121];

2. Что произойдет с этой областью при завершении работы  функции MT4_EXPFUNC double __stdcall functionW1( double *Buffer1) 

2. Куда будет указывать  *arr  после завершения работы функции MT4_EXPFUNC double __stdcall functionW1( double *Buffer1) - то есть, в тот момент, когда Вы его получите в МКЛ4  

И еще, ИМХО, не стоит возвращать указатели на память, размещенную в ДЛЛ, даже если это делать правильно - с учетом области видимости. Разместите память в МКЛ, передайте в ДЛЛ ссылку, заполните там и потом работайте в МКЛ

Вот тут и вопрос. Мне надо забрать массив из мт4 и с ним потом в с++ делать преобразования. Для теста я просто прибавил число. Я вижу , что что-то с памятью с моей стало))) но как правильно написать не понимаю.