OOP, Vorlagen und Makros in mql5, Feinheiten und Anwendungen - Seite 24

 
Vict:

Es wird also funktionieren, denke ich:

so funktioniert das nicht

#import erwartet einen Dateinamen

Sieg:

Ich verstehe es einfach nicht - wozu brennen die Kerzen?

Ich möchte nicht Verbindungsmanager in dll zu tun, und in MT4 aus irgendeinem Grund, wenn ich 2 mal dll von 2 EAs dann neue dll Kopie aufrufen wird nicht im Speicher erstellt (dll hat statische Objekte, Wrapper über .Net - wenn ich eine dll dann es abstürzt, 2 verschiedene Dateien ohne Probleme laufen),

so wollte ich schnell - einfach kopieren mylib.dll Datei zu mylib02.dll und alles funktioniert ohne Probleme.... aber eine Makro-Substitution global deklarieren wollen

 
Igor Makanu:
So funktioniert es nicht

Und das sieht nach einem Fehler aus. Beachten Sie das PS im letzten Beitrag

PS: wenn Sie es wirklich wollen, versuchen Sie name_dll (ohne den Punkt), vielleicht klappt es ja.

 
Vict:

Und das sieht nach einem Fehler aus. Achten Sie auf das PS im vorherigen Beitrag

Dies ist bei MT4 nicht der Fall.

MT4 sieht die dll selbst nur zur Laufzeit, und was ich mit Ihnen diskutiere - es ist nicht durch den Compiler selbst erlaubt, d.h. dies ist, wie der Compiler übergeben wird

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

und wenn man es so schreibt:

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

d.h. es gibt eine starre Syntaxanweisung #import + eine Zeichenkette in Anführungszeichen - und das alles in einer Zeile

aber warum kann ich #import "mylib.dll" nicht durch Makro-Substitution in meiner Kombination ersetzen

Sieg:

PS: Wenn Sie es wirklich wollen, versuchen Sie, name_dll (ohne Punkt) anzugeben, vielleicht klappt es dann.

Ich verstehe nicht, warum ich nicht einmal Inludes mit bedingter Kompilierung erstellen kann? - alles funktioniert sehr primitiv in MQL .... obwohl ich hoffe, dass ich es einfach nicht verstehe
 
Igor Makanu:

Dies ist bei MT4 nicht der Fall.

MT4 wird die DLL selbst nur zur Laufzeit sehen, und was ich mit Ihnen bespreche - der Compiler wird sie nicht durchlassen, d.h. so wird der Compiler durchlassen

und wenn man es so schreibt:

d.h. es gibt eine starre Syntaxanweisung #import + eine Zeichenkette in Anführungszeichen - und das alles in einer Zeile

Aber wer weiß, warum ich nicht #import "mylib.dll" durch ein Makro für meine Kombination ersetzen kann

Ich verstehe nicht, warum ich nicht einmal Inludes mit bedingter Kompilierung erstellen kann? - alles funktioniert sehr primitiv in MQL .... obwohl ich hoffe, dass ich es einfach nicht verstehe

Ich weiß nicht, warum es bei Ihnen nicht funktioniert, bei mir funktioniert es.

#define  DD "jkjk.dll"
#import  DD
void fn();
#import
Setzen Sie nun einfach verschiedene DD in verschiedenen EAs ("lib_1.dll", "lib_2.dll").
 
Vict:

Ich weiß nicht, warum es bei Ihnen nicht funktioniert, bei mir funktioniert es.

Setzen Sie nun einfach verschiedene DD in verschiedenen EAs ("lib_1.dll", "lib_2.dll").

Sorry, vergessen - meine Quellen sind durch Slang-Präprozessor übergeben, in µl - ja, es funktioniert nicht.

 
Vict:

Sorry, vergessen - meine Quellen sind durch Slang-Präprozessor übergeben, in µl - ja, funktioniert nicht.

Im Allgemeinen habe ich MQL genommen, so dass es wie beabsichtigt funktionieren wird

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

Ich deklariere 2 Makrosubstitutionen im Hauptcode

#define  USE_DLL_NUMBER

#define  USE_DLL_NUMBER02 

... würde es auf ein Makro USE_DLL_NUMBER02 reduzieren- ist im Allgemeinen etwas Ähnliches wie das, was mir passen würde - ich möchte in der Lage sein, USE_DLL_NUMBER03, USE_DLL_NUMBER04 zu schreiben - in der Zukunft, wenn der Bedarf entsteht

 
Igor Makanu:

... reduzieren es auf ein einziges Makro USE_DLL_NUMBER02 - ist im Allgemeinen etwas ähnliches, was mir passen würde - ich möchte in der Lage sein, USE_DLL_NUMBER03 , USE_DLL_NUMBER04 - in der Zukunft zu schreiben, wenn die wollen

Im Allgemeinen war es möglich, dieses Problem mit Hilfe von Brute-Force-Verfahren zu lösen.

#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
 

Warum implementiert mql4 nicht ein #if-Makro, das nach Wert arbeitet, so dass man selektive Objekte erstellen könnte wie

#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
Dadurch kann das gesamte nachfolgende Programm mit dem richtigen Typ korrigiert werden
 
Ich bin noch nie auf einen Ausdruck gestoßen, der falsch ist.
ORDER_TIME_DONE_MSC == DEAL_TIME_MSC

Aus diesem Grund ist es schwierig, Statistiken über die Ausführungszeit von Aufträgen auf der Grundlage der Handelsgeschichte zu führen.

Wenn wir den Wert vonORDER_TIME_SETUP_MSC für Marktaufträge noch abgleichen können, ist er für Aufträge bedeutungslos.

 
Es ist höchstwahrscheinlich ein veraltetes Modell. Der Modifikator const garantiert nicht, dass das Objekt nicht verändert wird.
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);
}


Einige Compiler geben in diesen Situationen wahrscheinlich Warnungen aus.