Errori, bug, domande - pagina 167

 

Domanda sugli array dinamici

double open_main_array[] - variabile di classe

inizializzazione

ArraySetAsSeries(open_main_array,true);

La prima chiamata della funzione che contiene il seguente codice

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

2a chiamata della funzione

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

L'array open_main_array conterrà i dati copiati durante la 2° chiamata o l'array sarà incrementato e conterrà i dati della 1° e 2° chiamata?

In alternativa, potete usare:

ArrayFree(open_main_array)

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

variabile non inizializzata - significa che la variabile è garantita per avere un ramo pass-through quando non è inizializzata. per esempio, default è esplicitamente omesso in switch, in cui MainPrice dovrebbe essere esplicitamente inizializzato (o esplicitamente azzerato quando dichiarato).

A proposito di "passaggio garantito". Ecco un tale pezzo di codice:

            (1)         double local_low;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion=false;
            (4)         for(uint n=1;n<Ac-k;n++)
            (5)           {
            (6)            if(low[index_interior-n]<low[index_interior-n-1])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion=true;
            (10)              break;
            (11)              }
            (12)          }  
            (13)        if(interrupcion)
            (14)          {
            (15)           if(EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

Per l'ultima linea (linea 15) dice "possibile uso di una variabile non inizializzata 'local_low'".

Ma a causa dell'uso di bool-variabile interrupcion nella linea 9 subito dopo aver inizializzato la variabile local_low nella linea 8, risulta che nella linea 15 la variabile local_low sarà garantita inizializzata. Quindi a questo punto, l'avvertimento "possibile uso di una variabile non inizializzata 'local_low'" non significa "garantito", ma solo possibile esistenza di un ramo pass-through in cui la variabile non è inizializzata.

 
Yedelkin:

Sul "passaggio garantito". Ecco un pezzo di codice:

Per l'ultima linea (linea 15) dice "possibile uso di una variabile non inizializzata 'local_low'".

Ma a causa dell'uso di bool-variabile interrupcion nella linea 9 subito dopo aver inizializzato la variabile local_low nella linea 8, risulta che nella linea 15 la variabile local_low sarà garantita inizializzata. Quindi in questo momento l'avvertimento "possibile uso di una variabile non inizializzata 'local_low'" non significa "garantito" ma solo possibile presenza di un ramo pass-through dove la variabile non è inizializzata.

Proprio così, ti dà un avvertimento.

Non confonda il suo compiacimento con la realtà. La realtà si rivela dopo molti progetti e la comprensione che "questo non può essere perché la logica porta così e così" avviene ogni giorno.

 
Renat:

Non confondete la vostra fiducia in voi stessi con la realtà. La realtà si rivela dopo molti progetti e la realizzazione che "questo non può essere perché la logica porta così e così" avviene quotidianamente.

Si può avere una spiegazione adeguata? Il codice è dato, l'affermazione "moralista" è dichiarata, dov'è l'errore? Non capisco l'esoterismo.

...Se si considera la traduzione della frase"possibile uso di una variabile non inizializzata", l'avviso viene effettivamente emesso "assolutamente corretto". Ma non si tratta di "garantito", ma solo della possibile esistenza di un ramo di un passaggio in cui la variabile non è inizializzata. Questo è esattamente ciò di cui sto "fiduciosamente" parlando.

 
Yedelkin:

Possiamo avere una spiegazione adeguata? Il codice è dato, l'affermazione "moralista" è dichiarata, dov'è l'errore? Non capisco l'esoterismo.

E se invece di

interrupcion=true;

invece di (per esempio)...

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
Faresti anche tu un reclamo? Soprattutto se qualcheFunzioneN consiste in centinaia di righe di codice?

Secondo il tuo pezzo di codice, sì, la variabile è inizializzata se la linea 15 viene eseguita. Ma cosa direbbe al compilatore di fare nell'esempio che ho fatto? Il compito è difficile. E non c'è nemmeno bisogno di risolverlo.

L'errore si chiama"possibile (forse) uso di una variabile non inizializzata" (anche se lo sapete comunque).

È meglio assegnare esplicitamente qualche valore alla variabile local_low. Credetemi, può salvarvi da possibili errori in futuro (il codice viene corretto, qualcosa viene rimosso, qualcosa viene spostato, qualcosa viene cambiato, e la linea 13 può cadere da questo processo)

 
Yedelkin:

Possiamo avere una spiegazione adeguata? Il codice è dato, l'affermazione "moralista" è dichiarata, dov'è l'errore? Non capisco l'esoterismo.

Nel mondo reale, quando la stragrande maggioranza dei programmatori in qualsiasi linguaggio scrive codice completamente privo di protezione e glitch, i compilatori dovrebbero essere resi il più rigorosi possibile. La compiacenza dei programmatori "la logica è chiara, non ci dovrebbero essere problemi, tutto è inizializzato come dovrebbe essere" ha portato e porta e porterà ancora molti errori.

Ecco perché le domande sulla critica delle misure rigorose sono irrilevanti in questo caso.

 
Renat:

... La fiducia in se stessi dei programmatori "la logica è chiara, non ci dovrebbero essere problemi, tutto è inizializzato correttamente" ha causato, porta e porterà un enorme numero di errori.

Ecco perché la critica alle misure severe è irrilevante in questo caso.

Facciamo a meno delle critiche. Tanto più che non l'ho messo nelle mie parole. E per quanto riguarda la presenza di critiche da parte mia lei si sbaglia di grosso.

Allora, qual è il suo errore? Dal momento che non potete mettere l'esoterismo in un codice, vi prego di rispondermi sul linguaggio della logica. Cioè, in un linguaggio che qualsiasi programmatore può capire.

 
notused:

faresti anche tu un reclamo ? Soprattutto se qualcheFunzioneN consiste in centinaia di righe di codice?

Anche tu sei nello stesso posto. Beh, non ho nessuna lamentela. Voglio solo chiarire che non tutto è così categorico come dice Renat.

Che dire del codice. Ti ho dato un esempio specifico di codice che confuta la categoricità dell'affermazione di Renat usando la logica ordinaria. Grazie per i consigli, sto cercando di migliorare sempre.

 
Yedelkin:

Bando alle critiche. Soprattutto perché non l'ho messo nelle mie parole. E per quanto riguarda l'esistenza di una critica da parte mia, lei è profondamente in errore.

Allora, qual è il tuo errore? Dal momento che non potete mettere l'esoterismo in un codice, vi prego di rispondermi sul linguaggio della logica. Cioè, in un linguaggio che qualsiasi programmatore può capire.

Avete"possibile uso di una variabile non inizializzata 'local_low'".

E cosa si ottiene se

(1)         double local_low=1.1; // или что-то другое
 
Yedelkin:

Allora, cos'è un errore? Dato che non potete mettere l'esoterismo nel codice, vi prego di rispondere nel linguaggio della logica. Cioè, nel linguaggio che qualsiasi programmatore può capire.

Rileggete le mie risposte dal punto di vista di un manager di una società di software che ha portato molti progetti di software sul mercato.

Altrimenti, rimanendo al livello di "un programmatore qualsiasi", non capirete qual è l'errore.