Imparare e scrivere insieme in MQL5 - pagina 32

 

Non lo so :) nel nostro ufficio per il codice scritto come

std::string s = "";

come minimo saranno rimproverati, e giustamente, imho.

Di nuovo, questo è un tipo complesso che richiede una corretta inizializzazione alla creazione, se la stringa deve essere inizializzata, è un bug di MT5(4), di sicuro.

Forse la dimensione degli array dovrebbe essere azzerata immediatamente dopo la creazione?

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
TheXpert:

Non lo so :) Nella nostra azienda, si prende una multa per aver scritto codice come

Come minimo, sarete rimproverati, e giustamente, credo.

Prima di poter usare una variabile, dovete assegnarle un valore (inizializzarla esplicitamente). O non sei d'accordo?

L'inizializzazione esplicita non implica la sua necessità al momento della dichiarazione. Ma se il valore della variabile non inizializzata viene poi utilizzato in alcuni calcoli, le conseguenze sono imprevedibili.

 

Mi fai paura, Rashid, con tutto il rispetto.

Una classe ha un costruttore, che esegue l'inizializzazione iniziale dell'oggetto e include l'impostazione del valore predefinito, se è logico.

Se l'inizializzazione iniziale non avviene, ci deve essere un modo per sapere se l'oggetto è in uno stato adeguato. Con una stringa ha molto più senso impostare un valore predefinito.

std::string s = "";

Tale notazione è paranoia, una persona paranoica non può scrivere codice normale a priori.

Quindi le stringhe non sono inizializzate?

 
TheXpert:
Quindi le stringhe non sono inizializzate?
Naturalmente sono inizializzati, ma non alla stringa vuota "", ma a NULL.
 
TheXpert:

Mi fai paura, Rashid, con tutto il rispetto.

Una classe ha un costruttore, che è dove avviene l'inizializzazione dell'oggetto e include l'impostazione di un valore predefinito, se è logico.

Se l'inizializzazione iniziale non avviene, ci deve essere un modo per sapere se l'oggetto è in uno stato adeguato. Con una stringa ha molto più senso impostare un valore predefinito.

Tale notazione è paranoia, una persona paranoica non può scrivere codice normale a priori.

Quindi le stringhe non sono inizializzate?

Leggete la guida - https://www.mql5.com/ru/docs/basis/types/classes:

Se una struttura contiene variabili di tipo stringa e/o un oggetto array dinamico , il compilatore assegna un costruttore implicito a tale struttura, in cui tutti i membri della struttura di tipostringasono azzerati e viene fatta una corretta inizializzazione per l'oggetto array dinamico.

...

Costruttori e distruttori

Un costruttore è una funzione speciale che viene chiamata automaticamente quando si crea un oggetto struttura o una classe, e di solito è usato per inizializzare i membri della classe. Nella seguente discussione parleremo solo di classi, quanto detto sopra vale anche per le strutture, a meno che non sia indicato diversamente. Il nome del costruttore deve coincidere con il nome della classe. Il costruttore non ha un tipo di ritorno (potete specificare il tipo void).

Alcuni membri della classe - stringhe, array dinamici e oggetti che richiedono l'inizializzazione - saranno inizializzati comunque, indipendentemente dalla presenza di un costruttore.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

Che sfortuna... Almeno lo saprò.

Sarà NULLA anche nelle strutture?

 
TheXpert:

Che sfortuna... Beh, almeno lo saprò.

Sarà NULLA anche nelle strutture?

Basta confrontare con NULL e saprete tutto da soli - Tipo void e costante NULL:

Lavariabile costante predefinita NULL è di tipo nullo e può essere assegnata a variabili di qualsiasi altro tipo fondamentale senza conversione. È anche permesso confrontare variabili di tipi fondamentali conNULL.

Esempio:

//--- se una stringa non è inizializzata, assegnarle il nostro valore predefinito
if(some_string==NULL) some_string="vuoto";

NULL puòanche essere confrontato con puntatori a oggetti creati utilizzando l 'operatore new.

 
Rosh:

Prima che una variabile possa essere utilizzata, le deve essere assegnato un valore (inizializzato esplicitamente). O non sei d'accordo?

L'inizializzazione esplicita non implica la necessità di tale al momento della sua dichiarazione. Ma se il valore di una variabile non inizializzata viene successivamente utilizzato in alcuni calcoli, le conseguenze sono imprevedibili.

A proposito di uccelli.

//Struct StrMQL4_Deal
struct StrMQL4_Deal
{
//----------------------------------------------------------------------------//
double TP = 0;
double SL = 0;
//----------------------------------------------------------------------------//
};

E come risponderà il compilatore? E risponderà a quanto segue '=' - uso illegale dell'assegnazione

//Class CMqlExpert
class CMqlExpert
//Purpose: Main class of trade system. 
{
//----------------------------------------------------------------------------//
protected:
//****************************************************************************//
//                    Protected declarations of the class                     //
//****************************************************************************//
bool TradeMonday    = true; //Trade in monday
bool TradeTuesday   = true; //Trade in tuesday
bool TradeWednesday = true; //Trade in wednesday
bool TradeThursday  = true; //Trade in thursday
bool TradeFriday    = true; //Trade in friday
//----------------------------------------------------------------------------//
public:

Il compilatore non è stato piegato - '=' - uso illegale dell'assegnazione.

La mia domanda è - Cosa succederà se il programmatore (in questo caso, io) non inizializza le variabili prima di usarle (lo fa nel modo richiesto dal compilatore e omette questo momento nel costruttore)?


 
Interesting:

Ho una domanda - Cosa succede se il programmatore (in questo caso io) non si occupa di inizializzare le variabili prima di usarle (facendolo come richiesto dal compilatore e mancando questo punto nel costruttore)?

La domanda viene da un principiante...
 
sergeev:
Sembra una domanda di qualche nuovo arrivato...

Beh, questo è quello che ho pensato in quel momento (è stato molto tempo fa, mi viene in mente), ma ho voluto scrivere una domanda nella foga del momento. :)

Anche se ancora non capisco perché è vietato inizializzare le variabili a livello di compilatore.