Errori, bug, domande - pagina 2890

 
Roman:

Se avete bisogno di catturare un errore di questo valore, inizializzatelo bene con 333 ))
È solo un valore iniziale.

Esatto, è un bug. Quindi, o diamo un avvertimento sull'assegnazione di variabili non inizializzate in tutti i casi, o non lo facciamo, e la inizializziamo con zero di default per esempio, all'interno del linguaggio in tutti gli stessi casi.

 
Valeriy Yastremskiy:

Esatto, è un bug. Si scopre che o diamo un avvertimento per assegnare le variabili non iniziate in tutti i casi, o allora non lo diamo, ma lo iniziamo con zero predefinito per esempio, all'interno del linguaggio in tutti gli stessi casi.

Solo dove negli esempi di cui sopra ha visto questi casi?

 
A100:

Solo dove negli esempi di cui sopra ha visto questi casi?

Forum sul trading, sistemi di trading automatico e test di strategia

Bug, bug, domande

A100, 2020.10.27 16:11

Dovete inizializzarlo, ma solo con un valore significativo. Non c'è questo valore nell'esempio precedente, quindi la pratica non è male, l'unica possibile. Altrimenti ci sarebbe una doppia inizializzazione

int f( int i ) { /*вычисления*/ }
void g( int k )
{
        for ( int i = 0, j; i < k; i = j )
        {
                j = f( i );
                /*вычисления*/
        }
}

 
Roman:

E dov'èl'assegnazione delle variabili non inizializzate? Quale variabile non è inizializzata e a chi viene assegnata? Quello che avete evidenziato: j da = a sinistra j=, non a destra =j, cioè non è assegnato a nessuno prima che gli venga assegnato un valore

 
A100:

Solo dove negli esempi di cui sopra ha visto questi casi?

Sì, mi è sfuggito, in tutti i casi la variabile non inizializzata ha un'assegnazione, non il contrario. Forse il compilatore va dall'alto verso il basso in una riga, nel qual caso sì, l'assegnazione è in basso e viceversa in alto. C'è anche un avvertimento sulla possibile assegnazione a una variabile non inizializzata.

 
A100:

E dov'èl'assegnazione delle variabili non inizializzate? Quale variabile non è inizializzata e a chi viene assegnata? Quello che hai evidenziato è j=, non =j

Assegnazione a una variabile non inizializzata, nel corpo del ciclo. Prima della prima iterazione j non è ancora inizializzato.
Sarà inizializzato dopo che la prima iterazione è passata.
Il corpo del ciclo viene eseguito per primo, e poi l'ambito incrementale. Che avete sostituito con i = j

 
Roman:

Assegnazione a una variabile non inizializzata, nel corpo della funzione. Prima della prima iterazione j non è ancora inizializzato.
Sarà inizializzato dopo la prima iterazione.
Il corpo della funzione viene eseguito per primo, e poi l'area di incremento. Che avete sostituito con i = j

No, è giusto, non inferendo j sulla prima iterazione è iniziato solo j=f(i) e sulla seconda sarà solo i=j Penso che il compilatore stia analizzando dall'alto verso il basso e dando avvertimenti.

 
Valeriy Yastremskiy:

No, è giusto, la variabile j non è inizializzata sulla prima iterazione solo j=f(i) e sulla seconda iterazione solo i=j Penso che il compilatore analizza dall'alto verso il basso e dà avvertimenti.

Sì, ma prima della prima iterazione la variabile j non è ancora inizializzata, questo è ciò che il compilatore giura.

 
Valeriy Yastremskiy:

Sì, era sbagliato, in tutti i casi di variabile non inizializzata c'è un'assegnazione, non il contrario. Forse il compilatore va dall'alto verso il basso, quindi sì, l'assegnazione è in basso e viceversa in alto. C'è anche un avvertimento sulla possibile assegnazione a una variabile non inizializzata.

Questo può essere quando il compilatore non ha informazioni oggettive:

void f( int& i ) { /*вычисления*/ }
void OnStart()
{
        int i;
        f( i );
        int j = i; //нормально ??? а если i не инициализирована?
        printf("%d",j);
}

cioè forse f() stava inizializzando i e forse no. E qui il compilatore C++ dà un avvertimento, mentre quello MQL in qualche modo non lo fa.

 
A100:

Questo può essere quando il compilatore non ha oggettivamente alcuna informazione:

cioè forse f() ha avuto l'inizializzazione, forse no. E qui il compilatore C++ dà un avvertimento, MQL no.

Non posso sapere cosa dicono, penso che un compilatore più semplice. Analizza la sintassi del layout dall'alto verso il basso per evidenti errori di sintassi, non rispettando i tipi e usando variabili sbagliate. Quando nel secondo esempio l'inizializzazione è stata messa giù, non ha generato un avvertimento. Anche se l'esecuzione del programma è identica.

Motivazione: