Riferimenti alle matrici - pagina 6

 

Per informazioni:

  1. Tutti gli array in MQL5 sono passati solo per riferimento (4 o 8 byte nello stack), quindi non abbiate paura di passare array all'interno di funzioni - nessun costo speciale.
  2. È molto pericoloso memorizzare dei riferimenti di memoria reale, in particolare i riferimenti agli array controllati dal terminale stesso(buffer di indicatori, buffer OHLC), perché vengono realmente modificati/riallocati. Inoltre, è impossibile salvare riferimenti non documentati tra le chiamate (uscita ed entrata nel codice dello script) all'EA.
  3. Quando si passa un array a una DLL, viene specificato l'indirizzo iniziale del blocco di dati, e le dimensioni devono essere specificate separatamente.
 
mql5:

La prima cosa da capire è PERCHE'? E a cosa serve?

Se non vuoi fare collegamenti, lo faremo noi stessi.

E grazie ai partecipanti, grazie ai post in questo thread ho scoperto che la descrizione nella guida è superata...

Sì, è esilarante). Ma in realtà, non pensavo nemmeno che potesse essere pubblicato nell'aiuto.

Puoi dirmi già tutte le bandiere allora?

Renat:

Per informazioni:

  1. Tutti gli array in MQL5 sono passati solo per riferimento (4 o 8 byte nello stack), quindi non abbiate paura di passare array all'interno di funzioni - nessun costo speciale.

Non ho paura, sono ben consapevole che è poco costoso. È solo scomodo.

  1. È molto pericoloso memorizzare dei riferimenti di memoria reale, in particolare i riferimenti agli array gestiti dal terminale stesso(buffer di indicatori, buffer OHLC), perché vengono realmente modificati/riallocati. Inoltre, i riferimenti non documentati tra le chiamate (uscita ed entrata nel codice dello script) di EA non devono essere salvati.

Si prega di elaborare questo punto - può esserci una riallocazione della memoria durante OnCalculate? Questa è una stronzata.

Circa tra le chiamate, naturalmente, è chiaro.

Non voglio avere una funzione che vincola un indicatore o un terminale in generale, quindi userò la variante più sicura disponibile.

 
TheXpert:

Più su questo punto per favore - può esserci una riallocazione della memoria durante OnCalculate? Questo è semplicemente pazzesco.


Non "durante" - tra.
 
TheXpert:

Più su questo punto per favore - può esserci una riallocazione della memoria durante OnCalculate? Che sfortuna.

Tra una chiamata e l'altra, ovviamente, è comprensibile.

Naturalmente stiamo parlando di una possibile ridistribuzione tra le chiamate.

Il problema è che qualcuno salverà il riferimento tra le chiamate per errore o esplicitamente, nel 99% dei casi tutto funzionerà fino al crash. Dopo di che ci saranno pensieri abbastanza scontati "è colpa di Metakvots".

Per esempio, abbiamo avuto tali pensieri trasmessi da un compagno e hanno continuato a farlo per diversi anni, incapaci di accettare che la storia tra le chiamate possa essere scambiata/cambiata.

 
Renat:

Naturalmente, stiamo parlando di una possibile ridistribuzione tra le chiamate.

Il problema è che qualcuno è destinato a salvare il collegamento tra le chiamate per errore o esplicitamente, nel 99% dei casi tutto funzionerà fino al crash. Dopo di che ci saranno gli attesi pensieri "È colpa di Metakwots".

"Temere la colpa non è camminare in avanti" (c).

E un'altra cosa: è meglio rimpiangere il fatto, che il non fatto.

Renat, diciamo che sono d'accordo che le variabili di riferimento sono una potenziale fonte di problemi, ma questo si può dire di quasi tutti gli strumenti. A volte le persone colpiscono altre persone con dei cacciaviti. Non ha senso vietare i cacciaviti ora, ed è ancora più insensato toglierli semplicemente dalla produzione, perché possono essere fatti in casa senza troppi problemi.

I "riferimenti" come entità mql sono altamente desiderabili, nemmeno sotto forma di variabili, ma come possibilità di restituire un riferimento ( lvalue ) da una funzione. Questo permetterà di fare almeno indicizzatori di sinistra molto veloci per i contenitori e dare ogni sorta di altre caratteristiche aggiuntive, come:

MyTree.Search(Key).GetElement() = NewVal;

E capisco che la gente voglia restituire un riferimento a una variabile locale da una funzione!

E allora? Dimenticare i riferimenti, perché possono rendere la vita più difficile agli sciocchi?).

--

Queste limitazioni di mql5 (come la mancanza di collegamenti) a volte motivano fortemente la "fuga verso DLL", trasformando MT5 solo in un "driver di mercato" che fornisce la comunicazione con il broker. Ma l'idea originale era proprio il contrario - per eliminare la necessità di utilizzare strumenti di programmazione esterni, perché"tutto è proprio qui".

 

Non si può tornare indietro perché puntiamo alla massima sicurezza linguistica.

Lavorare con link grezzi è un passo solido e sicuro verso un incidente. E non è permesso mandare in crash i programmi con l'intero sistema di virtualizzazione tolto.

La nostra decisione è pienamente informata. MQL5 è usato per scrivere programmi che verranno eseguiti su un enorme numero di computer, e senza coinvolgimento umano.

 

Comunque, spero che il principio sia chiaro per chiunque ne abbia bisogno. Lo terrò per ora, solo per tenerlo per me. Ma lo sarà, e sarà aperta.

Non c'è bisogno di spiegare che i riferimenti a tipi base come int sono molto più facili da fare senza problemi.

L'unica questione che causa complessità e problemi di implementazione è l'ambito della variabile sottostante. C'è davvero una vasta gamma di possibilità.

________

Bene, e per motivazione vale la pena notare che i link aprono un intero livello di possibilità aggiuntive, come i wrapper per esempio.

 
I collegamenti lvalue sono previsti...
 
mql5:
I collegamenti lvalue sono previsti...
Amico, avresti dovuto dirmelo subito) non avrei fatto fatica. Ma questo è fantastico.
 

Saluti a tutti.


Mi chiedo se è cambiato qualcosa in otto anni?

Oppure, è ancora possibile ottenere un indirizzo di array da OnCalculate() solo usando msvcrt.dll e la funzione memcpy?

O tutti stanno ancora "trascinando" i riferimenti agli array attraverso l'intera struttura della classe (in alternativa, organizzando i propri array e copiando il contenuto ogni volta)?