ООП, шаблоны и макросы в mql5, тонкости и приёмы использования - страница 24

 
Vict:

Так заработет, наверное:

так не работает

#import is expecting a filename

Vict:

Только не понял - ради чего свечи жгутся? 

не охота в dll делать диспетчер подключений, а в МТ4 почему то, если вызвать 2 раза dll из 2-х ЕА  то новая копия dll в памяти не  создается (в dll статические объекты, обертка над .Net - если запускать одну dll то крешится, 2 разных файла без проблем),

вот и хотел по быстрому - просто скопировать файл mylib.dll в mylib02.dll и все работает без проблем.... но хочу глобально макроподстановку объявлять 

 
Igor Makanu:
так не работает

А это похоже на баг/недоработкку. Обратите внимание на ПС в прошлом посте

PS: если всё же очень хочется, то попробуйте имя либе дать name_dll (без точки), возможно взлетит.

 
Vict:

А это похоже на баг/недоработкку. Обратите внимание на ПС в прошлом посте

в МТ4 там дело не так обстоит

саму dll МТ4 увидит лишь в рантайм, а то что я с Вами обсуждаю - это не пропускает сам компилятор, т.е. вот так компилятор пропустит

#import "mylib.dll"
#import
#import "mylib"
#import

причем если так написать:

#import 
"mylib.dll"   //'mylib.dll' - expressions are not allowed on a global scope
#import

т.е. заложен жесткий синтаксис директива #import + какая то строка в кавычках - и это все в одной строке

НО фиг его знает - почему я  не могу через макроподстановку заместить #import "mylib.dll"  на свою комбинацию

Vict:

PS: если всё же очень хочется, то попробуйте имя либе дать name_dll (без точки), возможно взлетит.

не пойму почему я даже инклудники не могу собирать с условной компиляцией? - очень все примитивно как то работает в MQL .... хотя надеюсь что я просто не разобрался
 
Igor Makanu:

в МТ4 там дело не так обстоит

саму dll МТ4 увидит лишь в рантайм, а то что я с Вами обсуждаю - это не пропускает сам компилятор, т.е. вот так компилятор пропустит

причем если так написать:

т.е. заложен жесткий синтаксис директива #import + какая то строка в кавычках - и это все в одной строке

НО фиг его знает - почему я  не могу через макроподстановку заместить #import "mylib.dll"  на свою комбинацию

не пойму почему я даже инклудники не могу собирать с условной компиляцией? - очень все примитивно как то работает в MQL .... хотя надеюсь что я просто не разобрался

Не знаю почему у вас не работает, у меня все работет

#define DD "jkjk.dll"
#import DD
void fn();
#import
Теперь просто задать разный DD в разных экспертах ("lib_1.dll", "lib_2.dll").
 
Vict:

Не знаю почему у вас не работает, у меня все работет

Теперь просто задать разный DD в разных экспертах ("lib_1.dll", "lib_2.dll").

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

 
Vict:

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

в общем грубой сил взял MQL , так работать будет как задумано

#ifdef USE_DLL_NUMBER
   #ifdef USE_DLL_NUMBER02 
      #import "mylib2.dll"
   #endif 
#else 
#import "mylib.dll"   
#endif

в основном коде объявляю 2 макроподстановки 

#define USE_DLL_NUMBER

#define USE_DLL_NUMBER02 

... сократить бы это до одного макроса USE_DLL_NUMBER02    - это в общем, уже что то похожее на то что устраивало бы меня - хочу иметь возможность писать USE_DLL_NUMBER03 , USE_DLL_NUMBER04 - в будущем если приспичит

 
Igor Makanu:

... сократить бы это до одного макроса USE_DLL_NUMBER02    - это в общем, уже что то похожее на то что устраивало бы меня - хочу иметь возможность писать USE_DLL_NUMBER03 , USE_DLL_NUMBER04 - в будущем если приспичит

в общем с помощью грубой силы, получилось и эту проблему решить

#ifdef USE_DLL_NUMBER01 
#define USE_DLL_NUMBER 
#endif
#ifdef USE_DLL_NUMBER02  
#define USE_DLL_NUMBER 
#endif
#ifdef USE_DLL_NUMBER03 
#define USE_DLL_NUMBER 
#endif
#ifdef USE_DLL_NUMBER04 
#define USE_DLL_NUMBER 
#endif
#ifdef USE_DLL_NUMBER05 
#define USE_DLL_NUMBER 
#endif
 

Почему в mql4 не реализован макрос #if который работает по значению, можно было бы создавать выборочные объекты типа

#define Znah 0
#define PrmI int    Peremen=6;
#define PrmD double Peremen=3.345;

#if Znah//если больше 0 то появится переменная int Peremen
   PrmI
#else
   PrmD//иначе появится переменная double Peremen
#endif
В результате всю последующую программу можно править нужным типом
 
Ни разу не встречал, чтобы это выражение возвращало false.
ORDER_TIME_DONE_MSC == DEAL_TIME_MSC

Поэтому сложно вести статистику времени исполнения ордера на основании истории торгов.

Если для маркет-ордеров еще можно сопоставить значение ORDER_TIME_SETUP_MSC, то для отложек оно бессмысленно.

 
Скорее всего, баян. Модификатор const не гарантирует, что объект не будет изменен.
struct A
{
  int i;

  void f( const A &Value )  
  {
    Print(Value.i); // 0
    
    this.i = Value.i + 1;
    
    Print(Value.i); // 1
  }
};

void OnStart()
{
  A a;
  
  a.f(a);
}


Наверное, в таких ситуациях некоторые компиляторы выдают предупреждения.

Причина обращения: