Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй программу в Cobe Base. Миллионы трейдеров ее увидят!
logoped_vl
134
logoped_vl 2006.05.19 00: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

Помогите ...

Christo Tsvetanov
990
Christo Tsvetanov 2006.05.19 15:45  
NeuroShell2 - молодец.....

А откуда ты прочитал про far? НЕТУ такое в MQL4 :(

Тему о передаче параметров в DLL дисскутировалась не раз на этом форуме, так как в документации по прежнему ничего нет - есть только примеры, но там рассматрываются только несколько случаев.

К сожалению оказывается, что указателей можно передовать только для элементов массивов double. Вообще забудь вызывать чужой DLL от MQL

Решение твоего проблема заключается в использование междинного DLL-a - он получает задание от MQL, передает параметров к NeuroShell2, потом берет результат с NeuroShell2 и наконец передавать его обратно в MQL (через массив double)

Как говорят - все претензии к разработчикам :(
logoped_vl
134
logoped_vl 2006.05.19 16:31  
Itso:
А откуда ты прочитал про far? НЕТУ такое в MQL4

Это прототип вызова функции из NS2 dll-файла. Я знаю что в MQL нет длинных указателей.

В описании я нашел, что еще string передается как указатель. Если бы хоть это работало.

DLL от NS2 работает отдельно от пакета. Она берет итоги обучения сети и только обрабатывает их с твоими новыми данными. выдавая готовый результат.

Что такое междинный DLL?

Christo Tsvetanov
990
Christo Tsvetanov 2006.05.19 18:20  

междинный DLL - это ты должен сам сделать :(

Стринг передается конечно через указатель, но трогать содержимое нельзя :( - особенно если строка на выходе длинне чем та на входе - иначе будет "красивая" катастрофа.

А вот и линк с комментариями разработчиков - 'импорт из DLL'

Сразу признаюсь - поделяю твое неодобрение, но ничего нельзя поделать...

. ... Rick D. ... .
1062
. ... Rick D. ... . 2006.05.22 19:00  
Если задача не вычислительная, т.е. когда нужна большая производитедьность, то вернуть значения можно в виде строки, разделив элементы массива разделителями.
. ... Rick D. ... .
1062
. ... Rick D. ... . 2006.05.22 19:07  
Либо вариант - писать выходные данные в файл.
. ... Rick D. ... .
1062
. ... Rick D. ... . 2006.05.22 19:10  
Третий способ. Можно сделать метод double GetVal(int ind) и доставать элементы массива по одному.
logoped_vl
134
logoped_vl 2006.05.23 10:09  

Я не могу изменить DLL файл он готовый от пакета NS2.
Надо как-то обмануть MQL4 передав ссылки на строки или масивы, выделив достаточно места.
Она берет эту ссылку и записывает туда свое - главное чтобы выделенного места хватило.

Я так и не услышал точный ответ от разработчиков.
КАКИЕ ТИПЫ ДАННЫХ ПЕРЕДАЮТСЯ ИЗ MQL ПРОГРАММЫ В ИМПОРТИРУЕМЫЙ МОДУЛЬ DLL ПО УКАЗАТЕЛЮ ???

или им до лампочки, как народ трахается с их продуктом.

Slawa
Модератор
6756
Slawa 2006.05.23 10:38  
По ссылке передаются массивы. Строки - по значению
. ... Rick D. ... .
1062
. ... Rick D. ... . 2006.05.23 18:46  
Если нельзя изменить готовый dll, то можно поступить так.
Пишется промежуточный dll, который и вызывается из MQL.
В нем например 3 метода:
int Run(входные параметры);
int GetCount();
double GetVal(int ind);

Вызываем Run. Run вызывает метод из NS2.
Далее выдергиваем параметры из полученного массива по одному.
logoped_vl
134
logoped_vl 2006.05.23 22:42  
stringo писал (а):
По ссылке передаются массивы. Строки - по значению
Слава, какие массивы int, double, или и те и другие.
Как следует писать - просто имя массива или имя[].
Этого ни где нет.Дайте развернутый ответ или подправте заготовку в начале ветки.
Снизойдите. В конце концов это мы создаем массу пользователей ради которой дилинговые центры покупают ваш продукт.
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий