Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот тут и вопрос. Мне надо забрать массив из мт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.
Все это я делаю для тестирования и оно у меня не выходит.
Как Вы определили, что элементарные действия в длл не происходят ?
ЗЫ Пока писал пост - Вы уже сказали, что разобрались.
Удачи.