Errori, bug, domande - pagina 168

 
Manov:

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

Cosa dice se

Se la variabile è inizializzata con qualcosa, l'avvertimento scompare. Ma come potete vedere voi stessi, l'inizializzazione della variabile 'local_low' in questo frammento di codice non è necessaria. Quindi l'avvertimento non interferisce affatto con la vita.
 
Renat:

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.

:) Dato che non diventerò mai il capo di una società di software, resterò per sempre al livello di "un programmatore qualsiasi" (cioè un programmatore dilettante, per come la vedo io).

...E poiché il programmatore dilettante non ottiene mai una descrizione logica dell'errore, conclude che o non c'è semplicemente nessun errore nel suo pezzo di codice o l'errore è così complicato che nessuno può descriverlo nel linguaggio della logica. A questo punto, possiamo considerare che entrambe le parti si capiscono, la questione è finita.

 
Yedelkin:
Se la variabile è inizializzata con qualcosa, l'avvertimento scompare. Ma, come potete vedere voi stessi, l'inizializzazione della variabile local_low è ridondante in questo pezzo di codice. Quindi l'avvertimento non interferisce affatto con la vita.
Un codice concreto è probabilmente sì. ma il compilatore dovrà essere il più"infallibile" possibile.
 
Così, il monitor si è infiammato e ha detto al programmatore: mai nascondere l'inizializzazione dietro una condizione, mai usare una variabile del ciclo dopo il corpo del ciclo, controllare la divisione per zero, non moltiplicare inutilmente le entità, non scrivere if (a==true) ...
 
Manov:
... Il compilatore dovrà essere il più"infallibile" possibile.
Non sto discutendo su questo. È un utile avvertimento. Più di questi avvertimenti avete, meglio capirete il vostro codice.
 
Vigor:
... non scrivere se (a==true) ...

A proposito, in primavera ho fatto allenare Expert Advisors, in cui, avendo letto molta letteratura, ho inserito condizioni di tipo if(a). Ma gli esperti hanno iniziato a lavorare solo dopo che ho cambiato queste condizioni in condizioni come if (a==true). Ora riesco a malapena ad uscire da questa abitudine.
 
Yedelkin:

Ma a causa dell'uso di bool-variabile interrupcion nella linea 9 subito dopo l'inizializzazione della variabile local_low nella linea 8, risulta che nella linea 15 la variabile local_low sarà garantita per essere inizializzata. Quindi a questo punto, l'avvertimento "possibile uso di una variabile non inizializzata 'local_low'" non significa "garantito" ma solo possibile presenza di un ramo pass-through in cui la variabile non è inizializzata.
Nel vostro esempio, se Ac-k=0 , l'operatore for non sarà eseguito affatto e local_low sarà garantito non inizializzato. O è sbagliato?
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 

Se inviamo una richiesta di modifica di una posizione con gli stessi stop, otterremo un errore. Ma se si invia una richiesta di modifica di un ordine in sospeso con gli stessi parametri, la richiesta verrà eseguita. È questo il modo in cui l'abbiamo pianificato e non abbiamo bisogno di controllare i parametri per i cambiamenti?

Perché intasare il server con richieste inutili, per esempio, in caso di un errore nell'Expert Advisor o di una logica errata del suo funzionamento?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
Valmars:
Nel vostro esempio, se Ac-k=0 , allora l'istruzione for non sarà eseguita affatto e local_low è garantito non inizializzato. O è sbagliato?

Proprio così. Se Ac-k<=1, l'operatore for non deve essere eseguito affatto e la variabile local_low è garantita per rimanere non inizializzata. Ma poiché la variabile bool interrupcion rimarrà falsa (linea 3), la condizione nella linea 13 significa che la variabile non inizializzata local_low non sarà mai (non dovrebbe mai) usata nei calcoli. In particolare, un'espressione con la variabile local_low dalla linea 15 non dovrebbe essere valutata [a meno che, naturalmente, l'istruzione if funzioni esattamente come indicato nella guida:) ].

In altre parole, se la variabile local_low è garantita come non inizializzata, è anche garantito che non (non dovrebbe) essere usata nei calcoli.

 

void Graf()
{
if(ObjectFind(0, "H")<0) ObjectCreate(0, "H",OBJ_HLINE
,0,0,h,0);
if(ObjectFind(0, "L")<0) ObjectCreate(0, "L",OBJ_HLINE,0,0,l,0)
; ObjectSetDouble(0, "H",OBJPROP_PRICE,h)
; ObjectSetDouble(0, "L",OBJPROP_PRICE,l)
;
string bal = DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE),2)
;string equ = DoubleToString (AccountInfoDouble(ACCOUNT_EQUITY),2)
; string spread = DoubleToString(((Ask-Bid)/_Point),0)
; string space = ""
; string info= bal+space+equ+space+spread
;
if (ObjectFind(0, "info")<0) ObjectCreate(0, "info",OBJ_LABEL,0,0,0)
; ObjectSetInteger(0, "info",OBJPROP_XDISTANCE,0)
;ObjectSetInteger(0, "info",OBJPROP_YDISTANCE,15)
; ObjectSetString(0, "info",OBJPROP_TEXT,info)
;ObjectSetInteger(0, "info",OBJPROP_FONTSIZE,36)
; ObjectSetInteger(0, "info",OBJPROP_COLOR,Maroon)
; return
; }

Ecco un pezzo di codice. La funzione stampa i valori di bilancio, equity e spread ad ogni tick. Ma l'informazione viene mostrata per qualche motivo, non per il tick precedente... Per favore, aiutatemi a capire perché? In MT4 un codice simile cambia i valori ad ogni nuovo tick, e in MT5 con un nuovo tick le informazioni vengono visualizzate per il tick precedente.