Файловые операции через WINAPI. Разработчикам - НЕ СМЕШНО !!!

 

Передаю информацию между двумя советниками через файл. Вылезла такая хрень. Если я что-то делаю не так покажите, пожалуйста.

Скрипт для проверки

#import "kernel32.dll"
   int _lopen  (string path, int of);
   int _lcreat (string path, int attrib);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, string buffer, int bytes);
   int _lclose (int handle);
   bool DeleteFileA(string fileName);
#import
string path="C:\\", 
       in="flag.txt";
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
   int hfile,count,_temp2;
   double _temp3,_temp4,_temp5;
   string temp1="123456",temp2="1",temp3="123456",temp4="123456789",temp5="123456789";
//-----------------------------
   hfile=_lopen(path+in,0);
   if(hfile!=-1) {
      _llseek(hfile,0,0);
      while(true) {
         count=_lread(hfile,temp1,6);
         if(count==0) break;
         Print("temp1 : ",temp1);
         _lread(hfile,temp2,1);
         Print("temp2 : ",temp2);
         _lread(hfile,temp3,6);
         Print("temp3 : ",temp3);
         _lread(hfile,temp4,9);
         Print("temp4 : ",temp4);   
         _lread(hfile,temp5,9);
         Print("temp5 : ",temp5);    
Print("1 temp1 : ",temp1,"; temp2 : ",temp2,"; temp3 : ",temp3,"; temp4 : ",temp4,"; temp5 : ",temp5); 
      }
      _lclose (hfile);
   }
   return;
}

В логе:



Файлы:
flag.txt  1 kb
 
void start() {
   int hfile,count,_temp2;
   double _temp3,_temp4,_temp5;
   string temp1="123456",temp2="1",temp3="123456",temp4="aaa123456",temp5="123456789";

И все работает.

Вначале я подумал, что авторы компилятора вложили логику,

что компилятору становится скучно считывать похожие названия переменных.

Но потом оказалось, что нужно внести какое-то разнообразие в содержимое буферов.

.

P.S.: Увы это не шутка. 

Потому что не смешно, а грустно.


 
jartmailru >>:
И все работает.

У меня такая же фигня, что и в 1-м сообщении. Не помагает!


P.S. "Разнообразил" начальную инициализацию и все заработало, действительно, не смешно.

 
Talex >>:

У меня такая же фигня, что и в 1-м сообщении. Не помагает!


MetaTrader 225.

Заходил- выходил- перекомпилировал.

Все работает.

Файлы:
222.mq4  2 kb
 
Talex >>:

{...} P.S. "Разнообразил" начальную инициализацию и все заработало, действительно, не смешно. 

Значит, всё-таки помогло :-)

.

Значит, правильно я прогоняю тест массивов после инициализации :-).

Зря не догадался скинуть все в Dll :-).

 
jartmailru >>:



Да, заработало, спасибо. Но пришлось более изобретательней разнообразить начальную инициализацию переменных.

И у Вас кстати на картинке глюк еще не полностью прошел. Имею ввиду значения пары GBPJPY, а далее выводит 100.00

 
Talex >>:

Да, заработало, спасибо. Но пришлось более изобретательней разнообразить начальную инициализацию переменных.

И у Вас кстати на картинке глюк еще не полностью прошел. Имею ввиду значения пары GBPJPY, а далее выводит 100.00

Ага :-). Он подменяет значение переменной temp1 :-).

Talex, мазохист Вы наш, ну и зачем Вы это делаете, если оно у Вас в руках сыпется?!? :-)

 

АААААААА!!!!!!!

Я понял!!!! :-)

Это же они- как в джаве- сделали стринг пул- оптимизацию строковых литералов!!!

Только в джаве все строчки immutable и буфера свои никому не открывают.

В итоге все строки, инициализируемые одинаковыми значениями, ссылаются на одну и ту же область памяти!!

.

Это не ошибка, это оптимизация! :-)

В общем, юзера дураки! :-)

.

Короче, кто умный- посмотрит код метатрейдера и напишет генератор рандомных

(можно, кстати, и не рандомных) строк заданной длины под буфера для работы с API! :-)

 
jartmailru >>:

В итоге все строки, инициализируемые одинаковыми значениями, ссылаются на одну и ту же область памяти!!

Сильно сомневаюсь. А как же тогда строки в длл передавать?

Принял указатель, подменил значения, и вся оптимизация посыпалась нахрен, ибо хак, так получается?

 

Ну вот так и передавать- задавать им разные значения :-)).

А вот по поводу генерации строк- я не угадал :-(.

.

У кого был краш с передачей строк из Dll?

.

Надо писать вот так:

string ДляВызоваDllНомер1 = "Текст1";

string ДляВызоваDllНомер2 = "ДругойТекст";

string ДляВызоваDllНомер3 = "ТретийТекст";

.

И в коде

string res;

if(Вызов == 1) { dll(ДляВызоваDllНомер1); Вызов++; res = ДляВызоваDllНомер1; }

if(Вызов == 2) { dll(ДляВызоваDllНомер2); Вызов++; res = ДляВызоваDllНомер2; }

if(Вызов == 3) { dll(ДляВызоваDllНомер3); Вызов++; res = ДляВызоваDllНомер3; }

.

Это, конечно же, шутка, но с долей правды :-)

.

См. приложение- измененные строки у меня из Dll вообще ничего не смогли вернуть.

Файлы:
222_1.mq4  2 kb
 

Вот где-то так надо делать.

.

Типа, вызываем левую функцию-посредник.

Она у себя в scope имеет длинную строку.

Забавно- но операции все равно будут идти над одним и тем же буфером (гы-гы)...

Это однозначно новая концепция scope ;-).

Ты туда заходишь- а там после объявления переменной и инициализации *константой* значение с прошлого вызова :-).

Все возможно потому, что StringSubstr работает без оптимизации :-).

.

Но если MetaEditor еще проверяет нолик в строке... и меняет размер буфера (оптимизация) :-)...

То такая тема во многих случаях загнется :-).

Файлы:
222_2.mq4  2 kb
Причина обращения: