Calcolo di un singolo array durante l'ottimizzazione - pagina 6

 
Alexey Viktorov:

Ecco un esempio di scrittura e lettura di un array

Eseguilo due volte in modalità debug e vedi quanto tempo ci vuole per scrivere e leggere l'array. La prima esecuzione scriverà l'array su file, e la seconda lo leggerà e inizierà a stampare le date dall'array. Poi capire la parte evidenziata, se IS_DEBUG_MODE deve essere rimosso, e se IsOptimization() deve essere inserito nella condizione.

Grazie!
 
Dmitry Fedoseev:

C'è una funzione, qualcosa come FileWriteInteger(). Identificare per posizione, la variabile deve essere all'inizio del file, dopo averla letta il puntatore si sposterà alla sua fine, cioè all'inizio dell'array, dopo aver letto l'array il puntatore sarà prima della variabile successiva...

Un articolo sul lavoro con i file sarà pubblicato presto.

Volevo scrivervi che non c'è nessun articolo sulle operazioni su file. Lei li rende informativi e lucidi, li leggerò sicuramente quando appariranno.

 

Provato a dichiarare un array a livello globale (codice mql4)

datetime T[];

riempire l'inite

ArrayResize(T,40);
datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };

Se non impostato all'inizio, stampa la data 1971, cioè l'array è vuoto

for (int x=0;x<=39;x++)
   {
   Print("T[x]=",T[x],"x=",x);   
   }

Se riempio l'array all'inizio, i valori appaiono. Può essere la ragione, che l'array è reinizializzato datetaime, ma senza di esso il codice non compila?

L'array scompare. Cosa faccio di sbagliato?

 
forexman77:

Provato a dichiarare un array a livello globale (codice mql4)

riempire l'inite

Se non impostato all'inizio, stampa la data 1971, cioè l'array è vuoto

Se riempio l'array all'inizio, i valori appaiono. Può essere la ragione, che l'array è reinizializzato datetaime, ma senza di esso il codice non compila?

L'array scompare. Cosa faccio di sbagliato?

Guarda cosa dice il compilatore.

ArrayResize(T,40);
datetime T[40]=

Con una mossa così semplice avete definito un array locale T che svanirà all'uscita di OnInit...

 
Maxim Kuznetsov:

controllare l'avvertimento che il compilatore genera.

Con una mossa così semplice, avete definito un array locale T che sarà perso quando uscite da OnInit...

Dice che c'è già una dichiarazione globale)

la dichiarazione di 'T' nasconde la dichiarazione globale alla linea 40

Ma, come farlo bene. Non avevo mai dichiarato un array usando le parentesi graffe. L'ho inizializzato con zero e ho impostato la sua dimensione e poi l'ho riempito con il ciclo. C'è un altro modo per farlo?

Se cancello il datetime nell'inite, il codice non compila, ma scrive due errori:

'{' - espressione attesa

'=' - uso di operazioni illegali



 
forexman77:

Dice che c'è già una dichiarazione globale)

la dichiarazione di 'T' nasconde la dichiarazione globale alla linea 40

Ma, come farlo bene. Non avevo mai dichiarato un array usando le parentesi graffe. L'ho inizializzato con zero e ho impostato la sua dimensione e poi l'ho riempito con il ciclo. C'è un altro modo per farlo?

Se cancello il datetime nell'inite, il codice non compila, ma scrive due errori:

'{' - espressione attesa

'=' - uso di operazioni illegali



La dichiarazione dell'array insieme all'inizializzazione delle costanti potrebbe (e dovrebbe) essere fatta a livello globale.

datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77:

Dice che c'è già una dichiarazione globale)

la dichiarazione di 'T' nasconde la dichiarazione globale alla linea 40

Ma, come farlo bene. Non avevo mai dichiarato un array usando le parentesi graffe. L'ho inizializzato con zero e ho impostato la sua dimensione e poi l'ho riempito con il ciclo. C'è un altro modo per farlo?

Se cancello il datetime nell'inite, il codice non compila, ma scrive due errori:

'{' - espressione attesa

'=' - uso di operazioni illegali



Con '=' potete inizializzare gli array solo quando li dichiarate. Sembra essere un residuo di C, ma è così che si fa qui :-)
 
Maxim Kuznetsov:

La dichiarazione dell'array insieme all'inizializzazione delle costanti avrebbe potuto (e dovuto) essere fatta a livello globale.

Sì, ho provato e funziona. E non puoi farlo senza livello globale, l'ho fatto solo per ridurre il costo computazionale, per riempire l'array una volta nell'init e poi usare i valori dell'array?

Anche se logicamente le variabili a livello globale sono sempre costanti, quindi il calcolo viene eseguito una sola volta all'inizio del programma?

 
forexman77:

Sì, ho provato e funziona. E non puoi farlo senza livello globale, l'ho fatto solo per ridurre il costo computazionale, per riempire l'array una volta nell'init e poi usare i valori dell'array?

Anche se logicamente le variabili a livello globale sono sempre costanti, quindi il calcolo viene eseguito una sola volta all'inizio del programma?

Sì, quando si prepara un binario ex4 ex5 per l'esecuzione dal terminale. Si può pensare che siano solo collegamenti all'array di dati descritto (e salvato all'interno di ex4/5 al momento della compilazione), e questo è molto veloce...
 
forexman77:

Dice che c'è già una dichiarazione globale)

la dichiarazione di 'T' nasconde la dichiarazione globale alla linea 40

Ma, come farlo bene. Non avevo mai dichiarato un array usando le parentesi graffe. L'ho inizializzato con zero e ho impostato la sua dimensione e poi l'ho riempito con il ciclo. C'è un altro modo per farlo?

Se cancello il datetime nell'inite, il codice non compila, ma scrive due errori:

'{' - espressione attesa

'=' - uso di operazioni illegali



Non ha molta importanza come viene riempito l'array. Dovete semplicemente impostare una condizione per cui se la dimensione dell'array è zero, deve essere valutata, riempita e scritta in un file. E in OnInit(), provate a leggere nell'array dichiarato usando il mio esempio. Di conseguenza, se c'è un array di file, viene letto e l'array viene riempito, l'array non verrà ricalcolato e riempito di nuovo.
Motivazione: