| / | Форум |
|
logoped
19.05.2006 02:40
Никак не пойму, как мне предать в функции DLL указатели на свои переменные. В главе "Описание внешних функций" очень расплывчато написано. Это заготовка под код индикатора //+------------------------------------------------------------------+ //| NS2_Sample01.mq4 | #property indicator_separate_window //+------------------------------------------------------------------+ int HandleNet; //netnumber int In_Number; // inputs int Out_Number; // outputs string FilePath="expert\ ns2\ns2_up01.def"; //defpath double arrayIn[36]; // inarray double arrayOut[3]; // outarray //+------------------------------------------------------------------+ int init() { return(0); }//---- indicators //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); OpenNet(char far *defpath, int far *netnumber, int far *inputs, int far *outputs); FireNet(int far *netnumber, double far *inarray, double far *outarray); CloseNet(int far *netnumber); return(0); } //+------------------------------------------------------------------+ Это заготовка под библиотечный файл. Описание функций DLL из пакета NeuroShell2 закоментировано в тексте //+------------------------------------------------------------------+ //| NS2_sample.mqh | //+------------------------------------------------------------------+ //| DLL imports | //+------------------------------------------------------------------+ #import "NS2-32.dll" int far PASCAL _export OpenNet(char far *defpath, ```````````````````````````````int far *netnumber, int far *inputs, int far *outputs); /* *defpath - это указатель на строку символов, содержащую путь к .DEF-файлу. Если путь содержит только имя файла, то этот файл должен быть в текущем каталоге. *netnumber - это указатель на целое число в Вашей программе, куда OpenNet поместит номер сети, который Вы будете использовать для указания на сеть в функциях FireNet и CloseNet. *inputs - это указатель на целое число в Вашей программе, куда OpenNet поместит ожидаемое сетью количество входов. *outputs - это указатель на целое число в Вашей программе, куда OpenNet поместит ожидаемое количество выходов сети. Если код возврата OpenNet отличен от нуля, это обычно происходит потому, что OpenNet не смогла найти действительного .DEF-файла в месте, указанном переменной defpath. */ int far PASCAL FireNet(int far *netnumber, double far *inarray, double far *outarray); /* *netnumber - это указатель на целое число, содержащее номер сети, полученный Вашей программой при создании сети с помощью функции OpenNet. *inarray - это указатель на ряд последовательных чисел двойной точности с плавающей запятой. Этот ряд должен состоять из стольких чисел, сколько входов ожидается сетью. В этом массиве должны содержаться входные значения. Не изменяйте масштаб значений, так как FireNet сделает это за Вас. *outarray - это также указатель на ряд последовательных чисел двойной точности с плавающей запятой. Этот ряд должен состоять из стольких чисел, сколько выходов ожидается у сети. FireNet поместит в этот массив выходные значения. Если Вы по ошибке зарезервируете меньше чисел двойной точности, чем окажется выходов, то Ваша программа, вероятно, аварийно прекратит свою работу, когда FireNet запишет оставшиеся выходы поверх части Вашей программы. */ int far PASCAL _export CloseNet(int far *netnumber); /*netnumber - это указатель на целое число, содержащее номер сети, полученный Вашей программой при создании сети с помощью функции OpenNet.*/ #import Помогите ... |
|
Увеличьте эффективность групповой работы Поставьте TeamWox и увеличьте эффективность групповой работы в вашей компании. TeamWox позволяет хранить всю рабочую информацию в одном месте: письма, документы, файлы, платежи и история сообщений в чате. Так решается проблема сохранности данных и удобной групповой работы с ними. |
|
Itso
19.05.2006 17:45
NeuroShell2 - молодец.....
А откуда ты прочитал про far? НЕТУ такое в MQL4 :( Тему о передаче параметров в DLL дисскутировалась не раз на этом форуме, так как в документации по прежнему ничего нет - есть только примеры, но там рассматрываются только несколько случаев. К сожалению оказывается, что указателей можно передовать только для элементов массивов double. Вообще забудь вызывать чужой DLL от MQL Решение твоего проблема заключается в использование междинного DLL-a - он получает задание от MQL, передает параметров к NeuroShell2, потом берет результат с NeuroShell2 и наконец передавать его обратно в MQL (через массив double) Как говорят - все претензии к разработчикам :( |
|
logoped
19.05.2006 18:31
Itso писал (а):
А откуда ты прочитал про far? НЕТУ такое в MQL4 Это прототип вызова функции из NS2 dll-файла. Я знаю что в MQL нет длинных указателей. В описании я нашел, что еще string передается как указатель. Если бы хоть это работало. DLL от NS2 работает отдельно от пакета. Она берет итоги обучения сети и только обрабатывает их с твоими новыми данными. выдавая готовый результат. Что такое междинный DLL? |
|
Itso
19.05.2006 20:20
междинный DLL - это ты должен сам сделать :( |
|
RickD
22.05.2006 21:00
Если задача не вычислительная, т.е. когда нужна большая производитедьность,
то вернуть значения можно в виде строки, разделив элементы массива
разделителями.
|
|
RickD
22.05.2006 21:07
Либо вариант - писать выходные данные в файл.
|
|
RickD
22.05.2006 21:10
Третий способ. Можно сделать метод double GetVal(int ind) и доставать элементы
массива по одному.
|
|
logoped
23.05.2006 12:09
Я не могу изменить DLL файл он готовый от пакета NS2. |
5198 |
stringo
23.05.2006 12:38
По ссылке передаются массивы. Строки - по значению
|
|
RickD
23.05.2006 20:46
Если нельзя изменить готовый dll, то можно поступить так.
Пишется промежуточный dll, который и вызывается из MQL. В нем например 3 метода: int Run(входные параметры); int GetCount(); double GetVal(int ind); Вызываем Run. Run вызывает метод из NS2. Далее выдергиваем параметры из полученного массива по одному. |
|
logoped
24.05.2006 00:42
stringo писал (а): Слава, какие массивы int, double, или и те и другие.По ссылке передаются массивы. Строки - по значению Как следует писать - просто имя массива или имя[]. Этого ни где нет.Дайте развернутый ответ или подправте заготовку в начале ветки. Снизойдите. В конце концов это мы создаем массу пользователей ради которой дилинговые центры покупают ваш продукт. |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий