OOP, modelli e macro in mql5, sottigliezze e usi - pagina 24

 
Vict:

Quindi funzionerà, credo:

non funziona così

#import si aspetta un nome di file

Vittoria:

Proprio non capisco - per cosa bruciano le candele?

Non voglio fare connection manager in dll, e in MT4 per qualche ragione, se chiamo 2 volte dll da 2 EAs allora la nuova copia dll non viene creata in memoria (dll ha oggetti statici, wrapper su .Net - se eseguo una dll allora va in crash, 2 file diversi senza problemi),

quindi volevo rapidamente - basta copiare il file mylib.dll in mylib02.dll e tutto funziona senza problemi.... ma volete dichiarare globalmente una sostituzione di macro

 
Igor Makanu:
non funziona così

E questo sembra un bug/fallimento. Fate attenzione al PS nell'ultimo post

PS: se vuoi ancora farlo, prova name_dll (senza il punto), forse decollerà.

 
Vict:

E questo sembra un bug/fallimento. Fate attenzione al PS nel post precedente

Questo non è il caso di MT4

MT4 vedrà la dll stessa solo in runtime, e quello che sto discutendo con voi - non è permesso dal compilatore stesso, cioè questo è il modo in cui il compilatore passerà

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

e se lo scrivi in questo modo

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

cioè c'è una direttiva di sintassi rigida #import + qualche stringa tra virgolette - ed è tutto su una linea

ma non so perché non posso sostituire #import "mylib.dll" con la mia combinazione attraverso la sostituzione di macro

Vittoria:

PS: se vuoi ancora veramente, prova a dare nome_dll (senza punto), forse decollerà.

Non capisco perché non posso nemmeno costruire gli inludi con la compilazione condizionale? - tutto funziona in modo molto primitivo in MQL .... anche se spero solo di non capirlo
 
Igor Makanu:

Questo non è il caso di MT4

MT4 vedrà la dll stessa solo in runtime, e quello di cui sto discutendo con voi - il compilatore non la lascerà passare, cioè questo è il modo in cui il compilatore passerà

e se lo scrivi in questo modo

cioè c'è una direttiva di sintassi rigida #import + qualche stringa tra virgolette - ed è tutto su una linea

Ma chissà perché non posso sostituire la macro #import "mylib.dll" con la mia combinazione

Non capisco perché non posso nemmeno costruire gli inludi con la compilazione condizionale? - tutto funziona in modo molto primitivo in MQL .... anche se spero solo di non capirlo

Non so perché non funziona per voi, per me funziona.

#define  DD "jkjk.dll"
#import  DD
void fn();
#import
Ora basta impostare DD diverse in EA diversi ("lib_1.dll", "lib_2.dll").
 
Vict:

Non so perché non funziona per te, funziona per me

Ora basta impostare DD diverse in EA diversi ("lib_1.dll", "lib_2.dll").

Scusa, ho dimenticato - le mie fonti sono passate attraverso il preprocessore slang, in µl - sì, non funziona.

 
Vict:

Scusa, ho dimenticato - le mie fonti sono passate attraverso il preprocessore slang, in µl - sì, non funziona.

In generale, ho preso MQL, quindi funzionerà come previsto

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

Dichiaro 2 sostituzioni di macro nel codice principale

#define  USE_DLL_NUMBER

#define  USE_DLL_NUMBER02 

... si ridurrebbe a una macro USE_DLL_NUMBER02 - è in generale qualcosa di simile a ciò che mi conviene - voglio essere in grado di scrivere USE_DLL_NUMBER03 , USE_DLL_NUMBER04 - in futuro se si presenta la necessità

 
Igor Makanu:

... ridurlo a una singola macro USE_DLL_NUMBER02 - è in generale qualcosa di simile a ciò che mi conviene - voglio essere in grado di scrivere USE_DLL_NUMBER03 , USE_DLL_NUMBER04 - in futuro se si vuole

in generale, con l'aiuto della forza bruta, è stato possibile risolvere questo problema

#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
 

Perché mql4 non implementa una macro #if che funziona per valore, si potrebbero creare oggetti selettivi come

#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
Di conseguenza, l'intero programma successivo può essere corretto con il tipo giusto
 
Non ho mai incontrato un'espressione che restituisse false.
ORDER_TIME_DONE_MSC == DEAL_TIME_MSC

Questo è il motivo per cui è difficile tenere statistiche sul tempo di esecuzione degli ordini in base alla storia del trading.

Se possiamo ancora abbinare il valore diORDER_TIME_SETUP_MSC per gli ordini a mercato, non ha senso per gli ordini.

 
È molto probabile che sia un obsoleto. Il modificatore const non garantisce che l'oggetto non venga modificato.
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);
}


Alcuni compilatori probabilmente emettono avvertimenti in queste situazioni.