La nuova sintassi MQL4 - pagina 4

 
Corretto, a meno che non ci sia una buona ragione, solo bool, int, double e stringa sono nel mio codice. Non mi preoccuperei di -1 negli indici, altrimenti avrei bisogno di lanciare ogni intero che si avvicina a questo indice.
 
RaptorUK:

uchar - Unsigned Character, perché dovreste usarlo per un ciclo? Non ha senso per me . . . usate un int. Lavorerai con gli ulong, che è quello che è un nuovo datetime . . . e quando fai typecast senza pensarci in futuro verrai avvertito . . . affronta l'avvertimento o ignoralo. Non sperare solo nel meglio però, fai come stai facendo ora, impara e comprendi

La roba che hai postato da stackoverflow ha senso per me, penso che sia un buon consiglio.

uchar era solo un esempio in quanto la mia domanda era relativa all'uso di piccoli tipi di variabili. uchar è un valore positivo a 8 bit da 0 a 255 quindi per un ciclo da 0 a 100 potresti usare l'uchar a 8 bit invece di un intero a 32 bit, se volessi.
 
SDC:
uchar era solo un esempio in quanto la mia domanda era relativa all'uso di piccoli tipi di variabili. uchar è un valore positivo di 1 byte da 0 a 255 quindi per un loop da 0 a 100 si potrebbe usare l'uchar da 1 byte.
Sì, potresti... ma perché dovresti? Funzionerà, ma perché ha senso logico usare un tipo di variabile destinato a valori di carattere per un contatore di loop?

Se avete bisogno di salvare un valore restituito da una funzione e la funzione in questione restituisce un uchar allora usate una variabile uchar per salvare il valore restituito. . . con l'originale mql4 questo non era un problema, sarà più un problema con il nuovo mql4.
 

Quando ho fatto la domanda non sapevo perché avrei voluto farlo, ecco perché ho fatto la domanda lol...

Non sapevo se un tipo di variabile a 8 bit avrebbe elaborato più velocemente di una a 32 bit o se sarebbe stato più lento o uguale, non sapevo se un valore a 8 bit avrebbe usato meno RAM o meno spazio su disco. visto che ora abbiamo questi piccoli tipi di variabili a nostra disposizione, ero solo interessato a conoscere i pro e i contro di usarli quando si adattavano ai requisiti del blocco di codice, rispetto all'uso di interi a 32 bit su tutta la linea.

Pensavo che forse un sistema operativo a 32 bit potesse elaborare quattro valori a 8 bit allo stesso tempo, ma non lo sapevo. A quanto pare no. Questo spiega perché un sistema operativo a 64 bit non è molto più veloce di uno a 32 bit, tranne per il fatto che può accedere a più RAM. Me lo sono chiesto spesso.

 

Ho una domanda per la quale non ho trovato la soluzione.

Come usare void&? Voglio dire, se ho bisogno di inviare qualsiasi puntatore a una DLL. Nel file di aiuto ci sono funzioni che usano questo tipo void, ma se lo metto da qualche parte nel sorgente, non si compila. Ho provato a usare template come soluzione alternativa, ma template è proibito all'interno della dichiarazione #import.

Ho gestito la costruzione per i tipi singoli, ma non sono in grado di implementare il passaggio di void& array pointer alla DLL, a meno che non specifichi il tipo esplicito.

int  FileReadArray(
   int    file_handle,               // File handle
   void&  array[],                   // Array to record
   int    start=0,                   // start array position to write
   int    count=WHOLE_ARRAY          // count to read
);
 
 

C'è qualche limitazione per passare array di strutture a una DLL?

Supponiamo che MT4Structure sia una struttura semplice.

Avendo importato la kernel32.dll, una singola struttura funziona bene:

bool ReadFile(
    /*_In_         HANDLE*/ int hFile,
    /*_Out_        LPVOID*/ MT4Structure& lpBuffer,
    /*_In_         DWORD*/ uint nNumberOfBytesToRead,
    /*_Out_opt_    LPDWORD*/ uint& lpNumberOfBytesRead[],
    /*_Inout_opt_  LPOVERLAPPED*/int lpOverlapped
);

ma non sono in grado di far funzionare accettando l'array di strutture. Il compilatore non compila con MT4Structure&[] se inviato come parametro a questa dichiarazione:

bool ReadFile(int, MT4Structure&[], uint, uint&[],int);
 
Ovo:

C'è qualche limitazione per passare array di strutture a una DLL?

Non riesco a vedere un problema con qualcosa del genere:

struct TestStruct {
   int Integer;
   uchar Byte;
   double Real;
};

#import "ExampleDllWhichReceivesStructureArray.dll"
   void Test(TestStruct &[]);
#import 

Funziona come ci si aspetta (a condizione che si permetta un diverso allineamento delle strutture di default in MT4 e nella DLL).

(BTW, in realtà non sono sicuro di quale sia la rappresentazione interna di un bool MQL4 ora, ma preferirei dichiarare le funzioni Win32 come int di ritorno. Le funzioni Win32 restituiscono un BOOL piuttosto che un bool C++. Un BOOL è una macro di Windows per un intero a 4 byte, il cui valore è 1/0, mentre un bool C++ è un singolo byte. Se dite a MT4 di aspettarsi un singolo byte di valore di ritorno dalle funzioni quando in realtà stanno restituendo quattro byte, allora potreste - anche se è molto improbabile - finire con la corruzione dello stack).

 
Ovo:

Come usare void&? Voglio dire, se ho bisogno di inviare qualsiasi puntatore a una DLL.

Non sono sicuro di quale sia la tua domanda. Per esempio, la documentazione dell'API Win32 usa void* per significare "questo accetta qualsiasi tipo di puntatore a qualsiasi cosa; alla funzione Win32 non importa quale sia il tuo blocco di memoria".

 
gchrmt4:

Non sono sicuro di quale sia la tua domanda. Per esempio, la documentazione dell'API Win32 usa void* per significare "questo accetta qualsiasi tipo di puntatore a qualsiasi cosa; alla funzione Win32 non importa quale sia il vostro blocco di memoria".


Esattamente. Ma sembra che non sia proprio possibile con il MQL4, e l'uso di un modello non è consentito all'interno del blocco #import. Quindi l'uso di strutture aggiuntive con winapi si trasforma in un aggiornamento manuale delle dichiarazioni #import ogni volta che è necessario un nuovo tipo. Il che è piuttosto scomodo per me, dato che la mia intenzione era di gestire le importazioni in un unico posto.
 
Ovo:

Esattamente. Ma sembra che non sia proprio possibile con MQL4, e l'uso di un modello non è consentito all'interno del blocco #import. Quindi l'uso di una struttura aggiuntiva con winapi si trasforma in un aggiornamento manuale delle dichiarazioni #import ogni volta che è necessario un nuovo tipo. Il che è piuttosto scomodo per me.
Non sono ancora sicuro di aver capito ma... Non credo che si possa dichiarare l'importazione MQL4 come void*. Devi usare un tipo di dati specifico nell'importazione, e poi puoi 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
Motivazione: