Новая версия платформы MetaTrader 5 build 2170: Области видимости в MQL5, глобальное обновление тестера стратегий и встроенного хостинга - страница 3

 
Andrey Azatskiy:

У меня скомпилился

Какой билд у metaeditor64.exe? Заменил на 2085 от старой версии - тоже стал компилить.

Попробуйте еще добавить такой код и скомпилить:

                        int err = 0;
                        err = GetLastError(err);
 
Ivan Titov:

Этот код раньше компилировался, теперь - нет:

В анонсе прямо дается правильный вариант вызова функции из DLL.

 
Rashid Umarov:

В анонсе прямо дается правильный вариант вызова функции из DLL.

В анонсе другой случай. Здесь параметры разные, и ошибки компиляции раньше не было. Почему нельзя было оставить как раньше? Сейчас придется весь старый код перелопачивать.

 
Ivan Titov:

В анонсе другой случай. Здесь параметры разные, и ошибки компиляции раньше не было. Почему нельзя было оставить как раньше? Сейчас придется весь старый код перелопачивать.

Потому что код сразу перестанет работать, если пользователь решит ввести функцию с совпадающей сигнатурой.

 
fxsaber:

Потому что код сразу перестанет работать, если пользователь решит ввести функцию с совпадающей сигнатурой.

С совпадающей сигнатурой пусть явно указывает, для остальных случаев - нет необходимости. Остаюсь на старом редакторе пока.

 
Ivan Titov:

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

Стал пользоваться Вашей библиотекой. Все хорошо работает настолько, что в код Ваш даже не лезу. И вот ввожу безобидную функцию у себя, а советник перестает работать.

А причина в том, что моя безобидная функция совпала по сигнатуре с Вашей импортируемой. Ну и что делать в таком случае? Правильно, лезть в Вашу библиотеку и править ее.

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

 
fxsaber:

А причина в том, что моя безобидная функция совпала по сигнатуре с Вашей импортируемой. 

Повторяю - не тот случай, сигнатура не совпадает. А для своей безобидной функции пожалуйста, указывайте явно.

 
Ivan Titov:

Повторяю - не тот случай, сигнатура не совпадает. А для своей безобидной функции пожалуйста, указывайте явно.

// Начало mqh-файла
#define DWORD int

#import "kernel32.dll"
DWORD GetLastError(int);
#import

void f()
{
  Print(GetLastError(0));
}

// Конец mqh-файла.


Запускаем такой скрипт с инклудом этого mqh.

void OnStart()
{
  f();
}


Он выдаст что-то вроде 127 в журнал.


А теперь в скрипт дописываем безобидную строку. Он становится таким

void OnStart()
{
  f();
}

int GetLastError( int ) { return(123); }


И результат стал 123! А по какой причине пользовательская функция стала влиять на результат функции из mqh?

Вот чтобы такой фигни не происходило, нужно делать однозначно.

 

А теперь в скрипт дописываем безобидную строку. Он становится таким

Вот тут и надо ругаться компилятору, т.к. сигнатура совпадает. Повторяю 4 раз - сигнатура разная.

 

раньше этот код работал и в МТ4 и в МТ5, сейчас только в МТ4

typedef void(*TFuncvoidPTR)(void);
//+------------------------------------------------------------------+
void OnStart()
{  TFuncvoidPTR arrPTR[3];
   arrPTR[0]=f1;
   arrPTR[1]=f2;
   arrPTR[2]=f3;
   for(int i=0; i<3; i++)
      arrPTR[i]();              //')' - expression expected

}
//_______________________________________________________________________
void f1() { Print("1"); }
void f2() { Print("2"); }
void f3() { Print("3"); }
//+------------------------------------------------------------------+

какой теперь синтаксис, чтобы получить указатель на функцию и затем вызвать функцию через указатель?