С++ обмен данными с mql4 - страница 2

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

1. размещаем массив в МКЛ 

2. если статика (double arr[100]) - можно сразу использовать, если массив динамический (double arr[]), то выделяем память New/ArrayResize

3. передаем ссылку в длл

4. в длл проводим преобразования 

есть примеры: ВашКаталогMT4\MQL4\Samples\DLLSample 

По поводу памяти: как только закончится выполнение функции С++, переменная arr (в Вашем варианте ее определения) выйдет из области видимости и будет уничтожена. Указатель, который Вы возвращаете, будет указывать куда попало. Не исключен вариант, что по этому адресу все еще будут доступны нужные значения, но это не гарантировано.

Посмотрите все-таки примеры.

 
VladislavVG:

1. размещаем массив в МКЛ 

2. если статика (double arr[100]) - можно сразу использовать, если массив динамический (double arr[]), то выделяем память New/ArrayResize

3. передаем ссылку в длл

4. в длл проводим преобразования 

есть примеры: ВашКаталогMT4\MQL4\Samples\DLLSample 

По поводу памяти: как только закончится выполнение функции С++, переменная arr (в Вашем варианте ее определения) выйдет из области видимости и будет уничтожена. Указатель, который Вы возвращаете, будет указывать куда попало. Не исключен вариант, что по этому адресу все еще будут доступны нужные значения, но это не гарантировано.

Посмотрите все-таки примеры.

Я сделал массив статикой. передаю ссылку в длл все как было. Не работают преобразования. не могу присвоить элементам нового массива arr значения массива, передаваемого из мкл. Смотрел примеры из каталога. Там нет преобразований с массивами. Там только ненужные мессаджи.

Просто я где-то в с++ неправильно присваиваю значения, Я все перепробовал и в мкл и с++ ничего не выходит. Если я делаю return(*Buffer1), то он назад в мкл передается. Если без указателя , то нет.

 
elisseev2000:

Я сделал массив статикой. передаю ссылку в длл все как было. Не работают преобразования. не могу присвоить элементам нового массива arr значения массива, передаваемого из мкл. Смотрел примеры из каталога. Там нет преобразований с массивами. Там только ненужные мессаджи.

Просто я где-то в с++ неправильно присваиваю значения, Я все перепробовал и в мкл и с++ ничего не выходит. Если я делаю return(*Buffer1), то он назад в мкл передается. Если без указателя , то нет.

Покажите это "как обычно". Где-то допускаете ошибку.
 
Scriptong:
Покажите это "как обычно". Где-то допускаете ошибку.

MQL4

#property  indicator_chart_window 
#property indicator_buffers 1
#property indicator_color1 clrBlue
int Shift=24;
double Buffer1[122];
double Buffer2[122];
double Buffer3[122];
double Buffer4[122];
double Buffer5[122];
double Buffer6[];
#import "MyDll.dll"
double functionW1(double &Buffer1 );
#import
int init()
  {
SetIndexShift(0,Shift);
SetIndexStyle(0,DRAW_NONE);
SetIndexBuffer(0,Buffer6);
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);
}

C++

#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;  // Тут Buffer1 не читается и передается только значение 0.1
}   

   return  (*arr);
  }


 
elisseev2000:

MQL4

Да, тут целый ворох ошибок. Опишу основные.

1. Массив arr объявлен размером 121 элемент, но в цикле происходит выход за пределы массива - обращение к 122-ому элементу.

double arr[121];
for (int k=1;k<=121;k++)

Нумерация элементов происходит с нуля. Поэтому цикл должен быть организован так:

double arr[121];
for (int k = 0; k < 121; k++)

 А для универсальности вообще вот так:

double arr[121];
int arraySize = ArraySize(arr);
for (int k = 0; k < arraySize; k++)

 

2. В DLL ожидается передача указателя на массив, а передается значение одного из элементов массива. То есть вместо:

functionW1(arr[k])

 должно быть просто:

functionW1(arr)

 Тогда и вышеописанный цикл не потребуется. Также при передаче указателя на массив следует передавать размер этого массива, чтобы знать пределы памяти, отведенной для него:

MQL4:

#import "MyDll.dll"
   void functionW1(double &Buffer1[], int arraySize);
#import

 

DLL:
MT4_EXPFUNC void __stdcall functionW1(double *Buffer1, int arraySize)
{
        for (int i = 0; i < arraySize; i++)
        {
                *Buffer1 += 0.1;
                Buffer1++;
        }
}

 

3. После объявления массива arr в его элементах находится мусор. Поэтому неизвестно, к чему там будет добавляться 0.1. Необходимо проводить инициализацию массива.

 

У меня получается такой  код:

#import "TestMQL4.dll"
   void functionW1(double &Buffer1[], int arraySize);
#import

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   double arr[121];
   ArrayInitialize(arr, 2);
   int arraySize = ArraySize(arr);
   functionW1(arr, arraySize);
   
   for (int i = 0; i < arraySize; i++)
      Print("arr[", i, "] = ", arr[i]);
}

TestMQL4.cpp
#define MT4_EXPFUNC __declspec(dllexport)
MT4_EXPFUNC void __stdcall functionW1(double *Buffer1, int arraySize)
{
        for (int i = 0; i < arraySize; i++)
        {
                *Buffer1 += 0.1;
                Buffer1++;
        }
}
 
Scriptong:

Да, тут целый ворох ошибок. Опишу основные.

1. Массив arr объявлен размером 121 элемент, но в цикле происходит выход за пределы массива - обращение к 122-ому элементу.

Нумерация элементов происходит с нуля. Поэтому цикл должен быть организован так:

 А для универсальности вообще вот так:

 

2. В DLL ожидается передача указателя на массив, а передается значение одного из элементов массива. То есть вместо:

 должно быть просто:

 Тогда и вышеописанный цикл не потребуется. Также при передаче указателя на массив следует передавать размер этого массива, чтобы знать пределы памяти, отведенной для него:

 

 

3. После объявления массива arr в его элементах находится мусор. Поэтому неизвестно, к чему там будет добавляться 0.1. Необходимо проводить инициализацию массива.

 

У меня получается такой  код:


Вопрос первый по MQL если написать так
functionW1(arr, arraySize); то идет ошибка 'arr' - parameter conversion not allowed	по с++ 
я не понял про functionW1(arr) у меня такого нет. Насчет массива arr он мне необходим для теста ,чтобы потом с Buffer производить сложные вычисления. Я не могу понять почему у меня в длл не проходит элементарное действие. Каждому элементу массива arr присвоить 
соответствующий элемент массива Buffer+например 0.1. Все это я делаю для тестирования и оно у меня не выходит. 
 
elisseev2000:
functionW1(arr, arraySize); то идет ошибка 'arr' - parameter conversion not allowed

Я же привел полный текст программы. Там нет таких ошибок. Я проверил.

В своем варианте кода Вы передаете значение, а потом пытаетесь работать с ним, как с массивом. Это грубая ошибка.

elisseev2000:
Насчет массива arr он мне необходим для теста ,чтобы потом с Buffer производить сложные вычисления.

 Какой именно массив arr имеется в виду: тот, что в MQL-коде, или тот, что в cpp-коде?

elisseev2000:
 Я не могу понять почему у меня в длл не проходит элементарное действие. Каждому элементу массива arr присвоить 

соответствующий элемент массива Buffer+например 0.1


 Для начала Вам нужно разобраться в синтаксисе MQL4 и C++, чтобы не допускать элементарные ошибки. По крайней мере, до тех пор, пока не сможете отличить передачу массива по указателю от передачи значения.

А решение задачи я уже показал, оно рабочее. 

 
Scriptong:

Я же привел полный текст программы. Там нет таких ошибок. Я проверил.

В своем варианте кода Вы передаете значение, а потом пытаетесь работать с ним, как с массивом. Это грубая ошибка.

 Какой именно массив arr имеется в виду: тот, что в MQL-коде, или тот, что в cpp-коде?

 Для начала Вам нужно разобраться в синтаксисе MQL4 и C++, чтобы не допускать элементарные ошибки. По крайней мере, до тех пор, пока не сможете отличить передачу массива по указателю от передачи значения.

А решение задачи я уже показал, оно рабочее. 

Да все разобрался. перепутал одно с другим, а это никак низзя. Спасибо большое.
 

elisseev2000:

Насчет массива arr он мне необходим для теста ,чтобы потом с Buffer производить сложные вычисления.

Я не могу понять почему у меня в длл не проходит элементарное действие. Каждому элементу массива arr присвоить соответствующий элемент массива Buffer+например 0.1.

Все это я делаю для тестирования и оно у меня не выходит.  

Как Вы определили, что элементарные действия в длл не происходят ?

ЗЫ Пока писал пост - Вы уже сказали, что разобрались.

Удачи.