Я использовал либу FANN2MQL в MQL4, всё работало под WinXP и Win7. Теперь пытаюсь использовать её в MQL5. Обучение происходит, но функция ann_save() не сохраняет файл в заданный путь. Ни в C:\\ANN\\, ни в TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\"
В то же время функция возвращает 0, т.е. "нет ошибки".
OS Windows 7. Права доступа к путям полные.
Кто перекрывает доступ к файлам, MT5 или Win7? И что делать?
Об ошибке функция всё-же сообщает, я был неправ.
А проблема оказалась в следующем - Fann2MQL.dll под MT5/Win7 получает не строку пути, а её первый символ. И когда я передаю "C:\\ANN\\0.net", она получает "C" и сохраняет файл "C" в дефолтную папку "C:\Program Files\MetaTrader 5\", если установить на эту папку достаточные права (по умолчанию их нет).
Похоже, дело в этом:
FANN2MQL_API int __stdcall f2M_save(int ann, char *path)
и для FANN2MQL/MT5 надо что-то переделать в исходниках.
и для FANN2MQL/MT5 надо что-то переделать в исходниках.
Кто как конвертирует текст? Я нашел 2 ф-и:
string ANSI2UNICODE(string s) { ushort mychar; long m,d; double mm,dd; string img; string res=""; if (StringLen(s)>0) { string g=" "; for (int i=0;i<StringLen(s);i++) { string f=" "; mychar=ushort(StringGetCharacter(s,i)); mm=MathMod(mychar,256); img=DoubleToString(mm,0); m=StringToInteger(img); dd=(mychar-m)/256; img=DoubleToString(dd,0); d=StringToInteger(img); if (m!=0) { StringSetCharacter(f,0,ushort(m)); StringSetCharacter(f,1,ushort(d)); StringConcatenate(res,res,f); }//if (m!=0) else break; }//for (int i=0;i<StringLen(s);i++) }//if (StringLen(s)>0) return(res); } string UNICODE2ANSI(string s) { int leng,ipos; uchar m,d; ulong big; leng=StringLen(s); string unichar; string res=""; if (leng!=0) { unichar=" "; ipos=0; while (ipos<leng) { //uchar typecasted because each double byte char is actually one byte m=uchar(StringGetCharacter(s,ipos)); if (ipos+1<leng) d=uchar(StringGetCharacter(s,ipos+1)); else d=0; big=d*256+m; StringSetCharacter(unichar,0,ushort(big)); StringConcatenate(res,res,unichar); ipos=ipos+2; } } return(res); } //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { string original_unicode,ansi,converted_unicode; original_unicode="EvenString"; ansi=UNICODE2ANSI(original_unicode); converted_unicode=ANSI2UNICODE(ansi); Print(original_unicode," -> ",ansi," -> ",converted_unicode); original_unicode="OddString"; ansi=UNICODE2ANSI(original_unicode); converted_unicode=ANSI2UNICODE(ansi); Print(original_unicode," -> ",ansi," -> ",converted_unicode); }
У кого-то есть лучше решение?
Посмотрите штатные функции преобразования строк:
Посимвольно копирует преобразованную из unicode в ansi строку в указанное место массива типа uchar. Функция возвращает количество скопированных элементов.
int StringToCharArray( |
Копирует и преобразует часть массива типа uchar в возвращаемую строку.
string CharArrayToString( |

- www.mql5.com
bool ann_save(int ann, string path) { uchar p[]; StringToCharArray(path, p); if (f2M_save(ann, p) < 0) { ОБРАБОТКА ОШИБКИ return (false); } return (true); }
Ваш код не работает(ошибка при компиляции). Правильно работает, только с ф-яим, приведенными мною выше.
Написал свою ф-ю:
void ann_save(int ann,string path) { uchar t[]; //string text="dfkjlkjdshfgjksdhfgklsdjhfgksj"; StringToCharArray(path,t); //Comment(CharArrayToString(t,0,WHOLE_ARRAY,CP_OEMCP)); Print(CharArrayToString(t,0,WHOLE_ARRAY,CP_ACP)); Print("f2M_save("+IntegerToString(ann)+", "+path+") returned: "+IntegerToString(f2M_save(ann,CharArrayToString(t,0,WHOLE_ARRAY,CP_ACP)))); }
В логах пишет:
Но сеть все равно сохраняется в папке с терминалом. Что я делаю не так?
Ваш код не работает(ошибка при компиляции). Правильно работает, только с ф-яим, приведенными мною выше.
Написал свою ф-ю:
В логах пишет:
Но сеть все равно сохраняется в папке с терминалом. Что я делаю не так?
В заголовочном файле Fann2MQL.mqh измени:
int f2M_save(int ann, string path[]);
на:
int f2M_save(int ann, uchar &path[]);
и пользуйся:
bool ann_save(int ann, string path) { uchar p[]; StringToCharArray(path, p); if (f2M_save(ann, p) < 0) { return (false); } return (true); }:))

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я использовал либу FANN2MQL в MQL4, всё работало под WinXP и Win7. Теперь пытаюсь использовать её в MQL5. Обучение происходит, но функция ann_save() не сохраняет файл в заданный путь. Ни в C:\\ANN\\, ни в TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\"
В то же время функция возвращает 0, т.е. "нет ошибки".
OS Windows 7. Права доступа к путям полные.
Кто перекрывает доступ к файлам, MT5 или Win7? И что делать?