Errori, bug, domande - pagina 2566

 
Slava:

Con questa fusione, non c'è perdita di dati. O è 0 o non è 0.

Un altro caso è quando double -> qualsiasi tipo intero (fino a int32 incluso)

Stai giocando un po' troppo con gli avvertimenti secondo me, c'è una mancanza di coerenza nel tuo giudizio

bool continuation()const {return this.last_level;}  // uint last_level
// expression not boolean	lrp_last_9.mq5	260	42
 
Vict:

Hai esagerato un po' con gli avvertimenti secondo me, c'è una mancanza di coerenza nel giudizio

D'accordo

Anche qui,non c'è perdita di dati in questo senso(o 0 o non 0)

void OnStart()
{
        int i = -1;
        while ( ++i ); //Warning: expression not boolean
}

ma c'è un avvertimento. Ci si aspettava un approccio uniforme

 

Risultato di un tentativo di accedere a una proprietà di un'istanza di classe da una funzione statica della stessa classe:

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
Il compilatore era silenzioso prima di questo.
 

Non inizializza una stringa vuota con un terminale nullo.

void OnStart()
{      
   string str;
   StringInit(str, 100, 0);
   
   Print(StringLen(str));     
}

Risultato

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  0

Previsto

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  100

Nota nella guida della funzione StringInit

Примечание

Если  character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

In effetti, non c'è alcuna distribuzione.
Cioè l'assegnazione in questo modo, dieci spazi

string str = "          ";

non è la stessa cosa.

string str;
StringInit(str, 10, 0);

Il testo di aiuto segnato in rosso non corrisponde al comportamento logico.

 
Vict:

Stai esagerando con gli avvertimenti secondo me, non c'è abbastanza coerenza nel giudizio

Gli avvertimenti non funzionano sulle operazioni booleane, ora ho notato per caso un errore di battitura nel mio codice, quindi l'ho riprodotto:

#define               getAsk(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define               getBid(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_BID)
//+------------------------------------------------------------------+
void OnStart()
  {
      double sl = 0.0,tp=0.0;
      if(sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print("");  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return(getAsk());
}

double OrderTakeProfit()
{
   return(getBid());
}
 
Roman:

Non inizializza una stringa vuota con un terminale nullo.

Risultato

Previsto

Nota nella guida della funzione StringInit

In realtà non c'è nessuna distribuzione.
Cioè l'assegnazione in questo modo, dieci spazi

non è la stessa cosa.

E non sembra corrispondere alla logica del comportamento, evidenziata in rosso nel testo di aiuto.

Ti sei perso la funzione StringBufferLen - restituisce la dimensione del buffer allocato. StringLen restituisce la lunghezza della stringa, cioè fino al carattere terminale, rispettivamente, se è all'inizio - lunghezza 0. Buffer != stringa.

 
Stanislav Korotky:

Hai trascurato la funzione StringBufferLen, che restituisce la dimensione del buffer allocato. StringLen restituisce la lunghezza della stringa, cioè fino al carattere terminale, rispettivamente, se è all'inizio - lunghezza 0. Buffer != stringa.

Altrimenti non conosce se stesso.

 
Stanislav Korotky:

Hai trascurato la funzione StringBufferLen, che restituisce la dimensione del buffer allocato.
StringLen restituisce la lunghezza della stringa, cioè fino al carattere terminale, rispettivamente, se è all'inizio - lunghezza 0. Buffer != stringa.

Questo è chiaro, stiamo parlando di inizializzare una stringa con degli zeri terminali.
Perché non riempire stringInit(str, 10, 0); con dieci zeri terminali? E restituisce la lunghezza effettiva della stringa.
Se volete inizializzare una stringa vuota, senza riempirla, per esempio con 100 caratteri,
allora o 100 spazi come str = " molti colpi alla tastiera ", o inizializzare la spazzatura StringInit(str, 100, 65)
Non capisco perché devo inizializzarlo con la spazzatura, ce n'è già abbastanza ))


 
Roman:

È comprensibile, stiamo parlando di inizializzare la stringa con zeri terminali.
Perché non riempire StringInit(str, 10, 0); con dieci zeri terminali? E restituisce la lunghezza effettiva della stringa.
Se volete inizializzare una stringa vuota, senza riempirla, per esempio con 100 caratteri,
allora o 100 spazi come str = " molti colpi alla tastiera ", o inizializzare la spazzatura StringInit(str, 100, 65)
Non capisco perché devo inizializzarlo con la spazzatura, ce n'è già abbastanza ))


Cosa ti fa pensare che non sia compilato? È solo che la lunghezza nella stringa µl non è memorizzata, è riconosciuta dal terminale zero.

StringInit(str, 100, ' ');

No?

E se avete bisogno di zeri, c'è una classe String da qualche parte nelle viscere di µl std.

 
Vict:

Cosa ti fa pensare che non sia compilato? È solo che la lunghezza nella stringa µl non è memorizzata, è riconosciuta dal terminale zero.

non è vero?

E se avete bisogno di zeri, c'è una classe String da qualche parte nelle viscere dello std µl.

Nah... Anche in questo modo restituisce zero. E il terzo parametro ushort, richiede un codice di carattere intero.

Se inizializzo come str = " "; e poi passo i dati dalla dll, tutto è ok.
Ma se lo inizializzo come StringInit(str, 10, 0) allora i dati non arrivano. Questo perché il codice non alloca la memoria per la stringa con la dimensione necessaria.

Se avessi codice per lo spazio, probabilmente avrebbe funzionato, ma che non ho trovato tale codice in diverse tabelle.
Abbiamo bisogno di allocare la memoria per il numero di caratteri futuri che poi andranno alla stringa vuota già inizializzata.
Ma spazzatura per inizializzare la stringa, non kommelpho.
StringInit(str, 100, 0); dovrebbe essere riempito di nulli terminali e restituire la lunghezza 100.