Aprender y escribir juntos en MQL5 - página 32

 

No sé :) en nuestra oficina para el código escrito como

std::string s = "";

como mínimo, se les regañará, y con razón, en mi opinión.

De nuevo, este es un tipo complejo que requiere una correcta inicialización en la creación, si la cadena necesita ser inicializada - es un error de MT5(4), seguro.

¿Tal vez el tamaño de las matrices debería ponerse a cero inmediatamente después de su creación?

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

No lo sé :) En nuestra empresa, recibirán una multa por escribir código como

Como mínimo, se le reprenderá, y con razón, creo.

Antes de poder utilizar una variable, hay que asignarle un valor (inicializarla explícitamente). ¿O no estás de acuerdo?

La inicialización explícita no implica su necesidad en el momento de la declaración. Pero si el valor de la variable no inicializada se utiliza luego en algunos cálculos, las consecuencias son imprevisibles.

 

Me asustas, Rashid, con todo el respeto.

Una clase tiene un constructor, que realiza la inicialización del objeto e incluye el establecimiento del valor por defecto, si es lógico.

Si la inicialización no se produce, debe haber una manera de saber si el objeto está en un estado adecuado. Con una cadena tiene mucho más sentido establecer un valor por defecto.

std::string s = "";

Esa notación es una paranoia, un paranoico no puede escribir un código normal a priori.

Entonces, ¿las cadenas no se inicializan?

 
TheXpert:
Entonces, ¿las cadenas no se inicializan?
Por supuesto que se inicializan, pero no a la cadena vacía "", sino a NULL.
 
TheXpert:

Me asustas, Rashid, con todo el respeto.

Una clase tiene un constructor, que es donde tiene lugar la inicialización del objeto e incluye el establecimiento de un valor por defecto, si eso tiene sentido.

Si la inicialización no se produce, debe haber una forma de saber si el objeto está en un estado adecuado. Con una cadena tiene mucho más sentido establecer un valor por defecto.

Esa notación es una paranoia, un paranoico no puede escribir un código normal a priori.

¿Las cadenas no se inicializan?

Lea la ayuda - https://www.mql5.com/ru/docs/basis/types/classes:

Si una estructura contiene variables de tipo cadena y/o un objeto arraydinámico, el compilador asigna un constructor implícito a dicha estructura, en el que se ponen a cero todos los miembros de la estructura de tipo cadena y se realiza una correcta inicialización del objeto array dinámico.

...

Constructores y destructores

Un constructor es una función especial que se llama automáticamente cuando se crea un objeto de estructura o una clase, y suele utilizarse para inicializar los miembros de la clase. En la siguiente discusión sólo hablaremos de clases, lo anterior también se aplica a las estructuras, a menos que se indique lo contrario. El nombre del constructor debe coincidir con el nombre de la clase. El constructor no tiene tipo de retorno (se puede especificar el tipo void).

Algunos miembros de la clase -cadenas, matrices dinámicas y objetos que requieren inicialización- se inicializarán de todos modos, independientemente de la presencia de un constructor.

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

Eso es un fastidio... Bueno, al menos lo sabré.

¿También será NULO en estructuras?

 
TheXpert:

Eso es un fastidio... Bueno, al menos lo sabré.

¿También será NULO en estructuras?

Sólo tienes que comparar con NULL y lo sabrás todo tú mismo - Tipo void y constante NULL:

La variable constante predefinida NULL es de tipo void. Se puede asignar a variables de cualquier otro tipo fundamental sin necesidad de conversión. También se permite comparar variables de tipos fundamentales conNULL.

Ejemplo:

//--- si una cadena no está inicializada, asignarle nuestro valor predefinido
if(some_string==NULL) some_string="empty";

NULLtambién puede compararse con punteros a objetos creados con el operador new.

 
Rosh:

Antes de poder utilizar una variable, hay que asignarle un valor (inicializarla explícitamente). ¿O no estás de acuerdo?

La inicialización explícita no implica su necesidad en el momento de declarar la variable. Pero si el valor de una variable no inicializada se utiliza luego en algunos cálculos, las consecuencias son imprevisibles.

Hablando de pájaros.

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

¿Y cómo responderá el compilador? Y responderá a lo siguiente '=' - uso de asignación ilegal

//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:

El compilador no estaba doblado - '=' - uso de asignación ilegal.

Mi pregunta es - ¿Qué ocurrirá si el programador (en este caso, yo) no inicializa las variables antes de utilizarlas (lo hace como exige el compilador y omite este momento en el constructor)?


 
Interesting:

Tengo una pregunta - ¿Qué pasa si el programador (en este caso yo) no se encarga de inicializar las variables antes de usarlas (haciéndolo como exige el compilador y omitiendo este punto en el constructor)?

La pregunta viene de un principiante...
 
sergeev:
Parece una pregunta de algún recién llegado...

Bueno, eso es lo que pensé en su momento (fue hace mucho tiempo, me viene a la mente), pero quise escribir una solicitud en caliente. :)

Aunque sigo sin entender por qué está prohibido inicializar variables a nivel de compilador.