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.
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 handlevoid& array[], // Array to recordint start=0, // start array position to writeint count=WHOLE_ARRAY// count to read
);
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:
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).
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".
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.
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
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
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 di 1 byte da 0 a 255 quindi per un loop da 0 a 100 si potrebbe usare l'uchar da 1 byte.
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.
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:
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:
C'è qualche limitazione per passare array di strutture a una DLL?
Non riesco a vedere un problema con qualcosa del genere:
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).
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".
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.
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.