La nuova sintassi MQL4 - pagina 5

 
gchrmt4:
Non sono ancora sicuro di aver capito ma... Non credo che si possa dichiarare l'importazione MQL4 come void*. Dovete usare un tipo di dati specifico nell'importazione, e poi potete usare l'importazione DLL solo con quel tipo di dati. Se volete usare la stessa funzione DLL con diversi tipi di dati, allora avete un problema, a meno che non ci sia un workaround come https://www.mql5.com/en/forum/148934


In realtà sto usando un workaround, ma è abbastanza debole - avvolgere qualsiasi tipo in una struttura generica. L'accettazione di una struttura generica come parametro potrebbe cambiare in qualsiasi versione futura, ma questo non funziona con gli array.

 
Ovo:


In realtà sto usando un workaround, ma è abbastanza debole - avvolgere qualsiasi tipo in una struttura generica. L'accettazione di una struttura generica come parametro potrebbe cambiare in qualsiasi versione futura, ma questo non funziona con gli array.

... Sembra che mi sbagli. Quello che entrambi stiamo dimenticando è che MQL4 ora ha l'overloading delle funzioni, e quindi è possibile fare qualcosa del genere:

#import "AnyDll.dll"
   void Test(TestStruct &[]);
   void Test(int &[]);
#import 
 
gchrmt4:

... Sembra che mi sbagli. Quello che entrambi stiamo dimenticando è che MQL4 ora ha l'overloading di funzioni, e quindi è possibile fare qualcosa del genere:


Certo, questo è ciò di cui parlo dall'inizio :)

Finora la mia importazione assomiglia a:

bool ReadFile(int, MT4Structure&, uint, uint&[],int); // wrapper for all simple types / structures
bool ReadFile(int, double&[], uint, uint&[],int);
bool ReadFile(int, int&[], uint, uint&[],int);
bool ReadFile(int, uchar&[], uint, uint&[],int);
bool ReadFile(int, MT4Structure&[], uint, uint&[],int); // this does not work

e mi chiedo quanto sia lunga questa lista (per una singola importazione) in un anno...

 

Ho anche notato una piccola incoerenza nella compilazione del codice con dipendenza dai file inclusi.

Se due o più progetti condividono lo stesso include, e il file include viene modificato, il primo progetto lo rileva e ricompila, mentre i progetti successivi no. Non è però un problema serio (possiamo cancellare tutti gli include in qualsiasi momento).

 

Ho bisogno solo di una risposta veloce, sono troppo stanco per cercarla oggi. È possibile distruggere scope2 prima che raggiunga il confine del blocco? Non credo, ma è meglio chiedere.

{
   MT4Scope* scope = new MT4Scope(_Symbol, 222);
   MT4Scope scope2(_Symbol, 223);
   delete scope; // calls destructor
   // here I want to call scope2 destructor, but I do not know how

   // some additional code
}
 
Ovo: Ho bisogno solo di una risposta veloce, sono troppo stanco per cercarla oggi. È possibile distruggere scope2 prima che raggiunga il confine del blocco? Non credo, ma è meglio chiedere.
No.
 
ubzen:
No.


Grazie.
 

Perché "ArrayMaximum" è diverso tra MT4 600+ e MT5? Pensavo che la ragione per migrare la sintassi di MT4 alla sintassi di MT5 fosse quella di rendere facile lo sviluppo di applicazioni che funzionassero su entrambi?


MT4

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           count=WHOLE_ARRAY,   // number of checked elements
   int           start=0              // index to start checking with
   );


MT5

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           start=0,             // index to start checking with
   int           count=WHOLE_ARRAY    // number of checked elements
   );
 
dlewisfl:

Perché "ArrayMaximum" è diverso tra MT4 600+ e MT5? Pensavo che la ragione per migrare la sintassi di MT4 alla sintassi di MT5 fosse quella di rendere facile lo sviluppo di applicazioni che funzionassero su entrambi?!

Probabilmente per cercare di mantenere una certa compatibilità all'indietro.
 
dlewisfl: Perché "ArrayMaximum" è diverso tra MT4 600+ e MT5? Pensavo che la ragione per migrare la sintassi di MT4 alla sintassi di MT5 fosse quella di rendere facile lo sviluppo di applicazioni che funzionassero su entrambi?!
Non va bene. Quindi crea il tuo:
int iArrayMaximum(const void& array[], int iLimit=WHOLE_ARRAY, int iBeg=0){
   if(iLimit == WHOLE_ARRAY) iLimit = ArraySize(array);
#ifdef __MQL4__
   return( ArrayMaximum(array, iLimit - iBeg + 1, iBeg) );
#else
   return( ArrayMaximum(array, iBeg, iLimit - iBeg + 1) );
#endif
}
Problema risolto.