Apprendre et écrire ensemble en MQL5 - page 32

 

Je ne sais pas :) à notre bureau pour le code écrit comme

std::string s = "";

au minimum, ils seront réprimandés, et à juste titre, je pense.

Encore une fois, il s'agit d'un type complexe qui nécessite une initialisation correcte à la création, si la chaîne doit être initialisée, c'est un bug de MT5(4), à coup sûr.

Peut-être que la taille des tableaux devrait être remise à zéro immédiatement après leur création ?

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

Je ne sais pas :) Dans notre entreprise, ils recevront une amende pour avoir écrit un code tel que

Au minimum, vous serez réprimandé, et à juste titre, je pense.

Avant de pouvoir utiliser une variable, vous devez lui attribuer une valeur (l'initialiser explicitement). Vous n'êtes pas d'accord ?

L'initialisation explicite n'implique pas qu'elle soit nécessaire au moment de la déclaration. Mais si la valeur de la variable non initialisée est ensuite utilisée dans certains calculs, les conséquences sont imprévisibles.

 

Vous me faites peur, Rashid, avec tout le respect que je vous dois.

Une classe possède un constructeur, qui effectue l'initialisation de l'objet et notamment la définition de la valeur par défaut, si elle est logique.

Si l'initialisation initiale n'a pas lieu, il doit y avoir un moyen de savoir si l'objet est dans un état adéquat. Avec une chaîne de caractères, il est beaucoup plus logique de définir une valeur par défaut.

std::string s = "";

Une telle notation est de la paranoïa, une personne paranoïaque ne peut pas écrire du code normal a priori.

Les chaînes de caractères ne sont donc pas initialisées ?

 
TheXpert:
Les chaînes de caractères ne sont donc pas initialisées ?
Bien sûr, ils sont initialisés, mais pas à la chaîne vide "", mais à NULL.
 
TheXpert:

Vous me faites peur, Rashid, avec tout le respect que je vous dois.

Une classe a un constructeur, qui est l'endroit où l'initialisation de l'objet a lieu et inclut la définition d'une valeur par défaut, si cela a un sens.

Si l'initialisation initiale n'a pas lieu, il doit y avoir un moyen de savoir si l'objet est dans un état adéquat. Avec une chaîne de caractères, il est beaucoup plus logique de définir une valeur par défaut.

Une telle notation est de la paranoïa, une personne paranoïaque ne peut pas écrire du code normal a priori.

Les chaînes de caractères ne sont donc pas initialisées ?

Lisez l'aide - https://www.mql5.com/ru/docs/basis/types/classes :

Si une structure contient des variables de type chaîne de caractères et/ou un objet tableau dynamique , le compilateur attribue un constructeur implicite à cette structure, dans lequel tous les membres de la structure de typechaîne de caractèressont mis à zéro et une initialisation correcte est effectuée pour l'objet tableau dynamique.

...

Constructeurs et destructeurs

Un constructeur est une fonction spéciale qui est appelée automatiquement lors de la création d'un objet de structure ou d'une classe, et qui est généralement utilisée pour initialiser les membres de la classe. Dans la discussion qui suit, nous ne parlerons que des classes, mais ce qui précède s'applique également aux structures, sauf indication contraire. Le nom du constructeur doit coïncider avec le nom de la classe. Le constructeur n'a pas de type de retour (vous pouvez spécifier le type void).

Certains membres de la classe - chaînes de caractères, tableaux dynamiques et objets nécessitant une initialisation - seront initialisés de toute façon, indépendamment de la présence d'un constructeur.

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

C'est une déception... Au moins, je saurai.

Sera-t-il également NULL dans les structures ?

 
TheXpert:

C'est une déception... Au moins, je le saurai.

Sera-t-il également NULL dans les structures ?

Comparez simplement à NULL et vous saurez tout vous-même - Type void et constante NULL:

La variable constante prédéfinie NULL est de type void, elle peut être affectée à des variables de tout autre type fondamental sans conversion. Il est également permis de comparer des variables de types fondamentaux àNULL.

Exemple :

//--- si une chaîne n'est pas initialisée, lui attribuer notre valeur prédéfinie
if(some_string==NULL) some_string="empty";

NULL peutégalement être comparé à des pointeurs d'objets créés à l'aide de l' opérateur new.

 
Rosh:

Avant qu'une variable puisse être utilisée, une valeur doit lui être attribuée (initialisation explicite). Vous n'êtes pas d'accord ?

L'initialisation explicite n'implique pas sa nécessité au moment de sa déclaration. Mais si la valeur d'une variable non initialisée est ensuite utilisée dans certains calculs, les conséquences sont imprévisibles.

En parlant d'oiseaux.

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

Et comment le compilateur va-t-il réagir ? Et il répondra aux questions suivantes '=' - utilisation illégale de l'affectation

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

Le compilateur ne s'est pas plié - '=' - utilisation illégale de l'affectation.

Ma question est la suivante : que se passera-t-il si le programmeur (dans ce cas, moi) n'initialise pas les variables avant de les utiliser (il le fait comme le compilateur l'exige et omet ce moment dans le constructeur) ?


 
Interesting:

J'ai une question : que se passe-t-il si le programmeur (dans ce cas, moi) ne prend pas soin d'initialiser les variables avant de les utiliser (en le faisant comme l'exige le compilateur et en omettant ce point dans le constructeur) ?

La question vient d'un débutant...
 
sergeev:
On dirait la question d'un nouveau venu...

Enfin, c'est ce que j'ai pensé à l'époque (c'était il y a longtemps, ça me revient), mais j'ai voulu écrire une demande dans le feu de l'action. :)

Bien que je ne comprenne toujours pas pourquoi il est interdit d'initialiser les variables au niveau du compilateur.

Raison: