MetaTrader 4 Build 529 beta rilasciato con un nuovo compilatore - pagina 17

 
Barbarian:

Funzionava prima? Non riesco a capire per dove dichiari la variabile i:


Nelle variabili globali, inizializzo i una volta e poi lo uso in tutti i cicli, è più conveniente e più facile ...
 
ALXIMIKS:

Si suppone che quando si cambiano i parametri di un indicatore che è già in esecuzione e funzionante, facendo doppio clic su di esso,

l'indicatorenon aggiorna le variabili statiche, quindi non viene ridisegnato?


Le variabili statiche mantengono il loro valore quando si reinizializza il programma. I valori non vengono salvati solo quando il programma viene rimosso dal grafico e ricongiunto. Per resettare le variabili statiche alla reinizializzazione, uso questa costruzione:

bool g_init;

void OnInit()
{
   g_init = true;
}

void MyFunction()
{
   static int myStatic;
   if (g_init)
   {
      myStatic = 0;
      g_init = false;
   }
}
 
VOLDEMAR:
Ecco come funziona...

Non funziona in questo modo.


Nel secondo caso, l'ambito dell'array dichiarato nella funzione è una funzione.

Nel codice

for(i=Coment-1; i>=1; i--){info[i]=info[i-1]; cv  [i]=cv  [i-1];}info[0]=txt;cv[0]=et;


siete sicuri di inizializzare tutti gli elementi dell'array con i valori txt e et? Forse le ultime 2 assegnazioni dovrebbero venire prima del ciclo e il ciclo dovrebbe essere costruito in modo diverso. O è un'idea del genere?

 
Scriptong:


Le variabili statiche mantengono il loro valore quando si reinizializza un programma. I valori non vengono mantenuti solo quando il programma viene rimosso dal grafico e riattaccato. Per resettare le variabili statiche alla reinizializzazione, uso la seguente costruzione:


Quindi ora devo cercare nella libreria e riscrivere tutto? È assurdo, perché tutto andava bene in 509, e qui ......
 
alexvd:


Nel secondo caso, l'ambito di un array dichiarato in una funzione è una funzione.

Nel codice.


Siete sicuri che state inizializzando tutti gli elementi dell'array con txt e et? Probabilmente gli ultimi 2 incarichi dovrebbero venire prima del ciclo. O è un'idea?


Il testo è prima spostato di un livello nel ciclo, poi i valori nulli sono assegnati al nuovo testo...

Questi array sono usati solo nelle funzioni che ho presentato sopra ...

Prima nella 509 e nelle build precedenti tutto funzionava in entrambi i casi... Ora solo nel primo caso ...

 
ALXIMIKS:

Che senso ha andare nella biblioteca e riscrivere tutto? È assurdo, perché tutto andava bene nel 509 e ora è ......


È semplicemente meglio inizializzare tutte le variabili da usare nel codice all'inizio del codice...

Questo semplifica il lavoro, e rende possibile vedere e resettare correttamente le variabili all'inizio del programma e utilizzare ulteriormente ...

 
ALXIMIKS:

Si suppone che quando si cambiano i parametri di un indicatore che è già in esecuzione e funzionante, facendo doppio clic su di esso,

l'indicatorenon aggiorna le variabili statiche, è per questo che non viene ridisegnato?

Per quanto mi ricordo è sempre stato così (nella build 509 di sicuro). È un bug.

VOLDEMAR:

Ho notato una cosa strana su diversi computer, uno con XP e un altro con W 7

Quando si inizializza un array all'interno di una funzione, l'array non viene riempito con l'intero valore, solo il valore 0 ...

Quando si inizializza un array a livello globale oltre tutte le funzioni, gli array sono riempiti completamente come dovrebbe essere...

È stato detto mille volte - inizializzate gli array e le variabili in modo esplicito, non aspettate le "benedizioni del cielo".

In caso di dichiarazione locale si è solo fortunati e non ricevono rifiuti. Ma non ci conterei.

 
Si prega di notare che il nuovo compilatore e il nuovo ambiente di esecuzione controllano la qualità del codice in modo molto più stretto. Un sacco di codice MQL4 è stato scritto da sviluppatori terzi a mani basse, e ora questi difetti saranno immediatamente visibili.
 

Correggetemi se ho sbagliato.

Uso una funzione di libreria in un indicatore, questa funzione dichiara alcune variabili statiche che partecipano al calcolo dell 'array dell'indicatore.

Se voglio cambiare i parametri dell'indicatore per correggere il calcolo dell'indicatore (in funzione delle variabili statiche),

passare il flag alla funzione di libreria che è responsabile della reinizializzazione (si dovrebbero espandere i parametri di ingresso di ogni funzione che ha variabili statiche)

fare l'azzeramento delle variabili statiche nel corpo, e non dimenticare di rimuovere il flag prima di completare il calcolo.

Sarebbe molto più facile se le variabili statiche avessero qualche parametro, impostato durante la loro dichiarazione, responsabile del fatto che queste variabili saranno azzerate durante la reinizializzazione.

 
Renat:
Si prega di notare che il nuovo compilatore e il nuovo runtime sono molto più severi nel controllo della qualità del codice. Molto codice MQL4 è stato scritto da sviluppatori terzi e ora questi difetti saranno immediatamente visibili.
Anche il manuale MQL4 (che si trova nell'editor) è stato aggiornato di conseguenza?