elisseev2000: Вот тут и вопрос. Мне надо забрать массив из мт4 и с ним потом в с++ делать преобразования. Для теста я просто прибавил число. Я вижу , что что-то с памятью с моей стало))) но как правильно написать не понимаю.
1. размещаем массив в МКЛ
2. если статика (double arr[100]) - можно сразу использовать, если массив динамический (double arr[]), то выделяем память New/ArrayResize
3. передаем ссылку в длл
4. в длл проводим преобразования
есть примеры: ВашКаталогMT4\MQL4\Samples\DLLSample
По поводу памяти: как только закончится выполнение функции С++, переменная arr (в Вашем варианте ее определения) выйдет из области видимости и будет уничтожена. Указатель, который Вы возвращаете, будет указывать куда попало. Не исключен вариант, что по этому адресу все еще будут доступны нужные значения, но это не гарантировано.
2. если статика (double arr[100]) - можно сразу использовать, если массив динамический (double arr[]), то выделяем память New/ArrayResize
3. передаем ссылку в длл
4. в длл проводим преобразования
есть примеры: ВашКаталогMT4\MQL4\Samples\DLLSample
По поводу памяти: как только закончится выполнение функции С++, переменная arr (в Вашем варианте ее определения) выйдет из области видимости и будет уничтожена. Указатель, который Вы возвращаете, будет указывать куда попало. Не исключен вариант, что по этому адресу все еще будут доступны нужные значения, но это не гарантировано.
Посмотрите все-таки примеры.
Я сделал массив статикой. передаю ссылку в длл все как было. Не работают преобразования. не могу присвоить элементам нового массива arr значения массива, передаваемого из мкл. Смотрел примеры из каталога. Там нет преобразований с массивами. Там только ненужные мессаджи.
Просто я где-то в с++ неправильно присваиваю значения, Я все перепробовал и в мкл и с++ ничего не выходит. Если я делаю return(*Buffer1), то он назад в мкл передается. Если без указателя , то нет.
Я сделал массив статикой. передаю ссылку в длл все как было. Не работают преобразования. не могу присвоить элементам нового массива arr значения массива, передаваемого из мкл. Смотрел примеры из каталога. Там нет преобразований с массивами. Там только ненужные мессаджи.
Просто я где-то в с++ неправильно присваиваю значения, Я все перепробовал и в мкл и с++ ничего не выходит. Если я делаю return(*Buffer1), то он назад в мкл передается. Если без указателя , то нет.
Покажите это "как обычно". Где-то допускаете ошибку.
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 |//+------------------------------------------------------------------+voidOnStart()
{
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++;
}
}
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. Все это я делаю для тестирования и оно у меня не выходит.
functionW1(arr, arraySize); то идет ошибка 'arr' - parameter conversion not allowed
Я же привел полный текст программы. Там нет таких ошибок. Я проверил.
В своем варианте кода Вы передаете значение, а потом пытаетесь работать с ним, как с массивом. Это грубая ошибка.
elisseev2000: Насчет массива arr он мне необходим для теста ,чтобы потом с Buffer производить сложные вычисления.
Какой именно массив arr имеется в виду: тот, что в MQL-коде, или тот, что в cpp-коде?
elisseev2000: Я не могу понять почему у меня в длл не проходит элементарное действие. Каждому элементу массива arr присвоить
соответствующий элемент массива Buffer+например 0.1
Для начала Вам нужно разобраться в синтаксисе MQL4 и C++, чтобы не допускать элементарные ошибки. По крайней мере, до тех пор, пока не сможете отличить передачу массива по указателю от передачи значения.
Я же привел полный текст программы. Там нет таких ошибок. Я проверил.
В своем варианте кода Вы передаете значение, а потом пытаетесь работать с ним, как с массивом. Это грубая ошибка.
Какой именно массив arr имеется в виду: тот, что в MQL-коде, или тот, что в cpp-коде?
Для начала Вам нужно разобраться в синтаксисе MQL4 и C++, чтобы не допускать элементарные ошибки. По крайней мере, до тех пор, пока не сможете отличить передачу массива по указателю от передачи значения.
А решение задачи я уже показал, оно рабочее.
Да все разобрался. перепутал одно с другим, а это никак низзя. Спасибо большое.
Насчет массива arr он мне необходим для теста ,чтобы потом с Buffer производить сложные вычисления.
Я не могу понять почему у меня в длл не проходит элементарное действие. Каждому элементу массива arr присвоить
соответствующий элемент массива Buffer+например 0.1.
Все это я делаю для тестирования и оно у меня не выходит.
Как Вы определили, что элементарные действия в длл не происходят ?
ЗЫ Пока писал пост - Вы уже сказали, что разобрались.
Вот тут и вопрос. Мне надо забрать массив из мт4 и с ним потом в с++ делать преобразования. Для теста я просто прибавил число. Я вижу , что что-то с памятью с моей стало))) но как правильно написать не понимаю.
1. размещаем массив в МКЛ
2. если статика (double arr[100]) - можно сразу использовать, если массив динамический (double arr[]), то выделяем память New/ArrayResize
3. передаем ссылку в длл
4. в длл проводим преобразования
есть примеры: ВашКаталогMT4\MQL4\Samples\DLLSample
По поводу памяти: как только закончится выполнение функции С++, переменная arr (в Вашем варианте ее определения) выйдет из области видимости и будет уничтожена. Указатель, который Вы возвращаете, будет указывать куда попало. Не исключен вариант, что по этому адресу все еще будут доступны нужные значения, но это не гарантировано.
Посмотрите все-таки примеры.
1. размещаем массив в МКЛ
2. если статика (double arr[100]) - можно сразу использовать, если массив динамический (double arr[]), то выделяем память New/ArrayResize
3. передаем ссылку в длл
4. в длл проводим преобразования
есть примеры: ВашКаталогMT4\MQL4\Samples\DLLSample
По поводу памяти: как только закончится выполнение функции С++, переменная arr (в Вашем варианте ее определения) выйдет из области видимости и будет уничтожена. Указатель, который Вы возвращаете, будет указывать куда попало. Не исключен вариант, что по этому адресу все еще будут доступны нужные значения, но это не гарантировано.
Посмотрите все-таки примеры.
Я сделал массив статикой. передаю ссылку в длл все как было. Не работают преобразования. не могу присвоить элементам нового массива arr значения массива, передаваемого из мкл. Смотрел примеры из каталога. Там нет преобразований с массивами. Там только ненужные мессаджи.
Просто я где-то в с++ неправильно присваиваю значения, Я все перепробовал и в мкл и с++ ничего не выходит. Если я делаю return(*Buffer1), то он назад в мкл передается. Если без указателя , то нет.
Я сделал массив статикой. передаю ссылку в длл все как было. Не работают преобразования. не могу присвоить элементам нового массива arr значения массива, передаваемого из мкл. Смотрел примеры из каталога. Там нет преобразований с массивами. Там только ненужные мессаджи.
Просто я где-то в с++ неправильно присваиваю значения, Я все перепробовал и в мкл и с++ ничего не выходит. Если я делаю return(*Buffer1), то он назад в мкл передается. Если без указателя , то нет.
Покажите это "как обычно". Где-то допускаете ошибку.
MQL4
MQL4
Да, тут целый ворох ошибок. Опишу основные.
1. Массив arr объявлен размером 121 элемент, но в цикле происходит выход за пределы массива - обращение к 122-ому элементу.
Нумерация элементов происходит с нуля. Поэтому цикл должен быть организован так:
А для универсальности вообще вот так:
2. В DLL ожидается передача указателя на массив, а передается значение одного из элементов массива. То есть вместо:
должно быть просто:
Тогда и вышеописанный цикл не потребуется. Также при передаче указателя на массив следует передавать размер этого массива, чтобы знать пределы памяти, отведенной для него:
3. После объявления массива arr в его элементах находится мусор. Поэтому неизвестно, к чему там будет добавляться 0.1. Необходимо проводить инициализацию массива.
У меня получается такой код:
Да, тут целый ворох ошибок. Опишу основные.
1. Массив arr объявлен размером 121 элемент, но в цикле происходит выход за пределы массива - обращение к 122-ому элементу.
Нумерация элементов происходит с нуля. Поэтому цикл должен быть организован так:
А для универсальности вообще вот так:
2. В DLL ожидается передача указателя на массив, а передается значение одного из элементов массива. То есть вместо:
должно быть просто:
Тогда и вышеописанный цикл не потребуется. Также при передаче указателя на массив следует передавать размер этого массива, чтобы знать пределы памяти, отведенной для него:
3. После объявления массива arr в его элементах находится мусор. Поэтому неизвестно, к чему там будет добавляться 0.1. Необходимо проводить инициализацию массива.
У меня получается такой код:
Я же привел полный текст программы. Там нет таких ошибок. Я проверил.
В своем варианте кода Вы передаете значение, а потом пытаетесь работать с ним, как с массивом. Это грубая ошибка.
Насчет массива arr он мне необходим для теста ,чтобы потом с Buffer производить сложные вычисления.
Какой именно массив arr имеется в виду: тот, что в MQL-коде, или тот, что в cpp-коде?
elisseev2000:
Я не могу понять почему у меня в длл не проходит элементарное действие. Каждому элементу массива arr присвоить
соответствующий элемент массива Buffer+например 0.1
Для начала Вам нужно разобраться в синтаксисе MQL4 и C++, чтобы не допускать элементарные ошибки. По крайней мере, до тех пор, пока не сможете отличить передачу массива по указателю от передачи значения.
А решение задачи я уже показал, оно рабочее.
Я же привел полный текст программы. Там нет таких ошибок. Я проверил.
В своем варианте кода Вы передаете значение, а потом пытаетесь работать с ним, как с массивом. Это грубая ошибка.
Какой именно массив arr имеется в виду: тот, что в MQL-коде, или тот, что в cpp-коде?
Для начала Вам нужно разобраться в синтаксисе MQL4 и C++, чтобы не допускать элементарные ошибки. По крайней мере, до тех пор, пока не сможете отличить передачу массива по указателю от передачи значения.
А решение задачи я уже показал, оно рабочее.
elisseev2000:
Насчет массива arr он мне необходим для теста ,чтобы потом с Buffer производить сложные вычисления.
Я не могу понять почему у меня в длл не проходит элементарное действие. Каждому элементу массива arr присвоить соответствующий элемент массива Buffer+например 0.1.
Все это я делаю для тестирования и оно у меня не выходит.
Как Вы определили, что элементарные действия в длл не происходят ?
ЗЫ Пока писал пост - Вы уже сказали, что разобрались.
Удачи.