Caractéristiques du langage mql5, subtilités et techniques - page 160

 
Alexey Viktorov:

NULL est une ambiguïté telle qu'il faut la traiter avec précaution.

void OnStart()
{
  uchar Bytes[];

  Print(StringToCharArray(NULL, Bytes)); // 0
  Print(StringToCharArray("", Bytes));   // 1
}

Encore une fois, une chaîne de caractères en entrée ne peut pas être NULL (forcé par ""). Les autres cordes le peuvent.

 
fxsaber:

Encore une fois, la chaîne d'entrée ne peut pas être NULL (forcé par ""). Les autres cordes le peuvent.

input est presque synonyme de const, const doit être initialisé
 
fxsaber:

Une fois de plus, la chaîne d'entrée ne peut pas être NULL (forcé par ""). Les autres cordes le peuvent.

Encore une fois, pourquoi pensez-vous qu'il ne devrait pas y avoir une telle conversion ? Mes connaissances et mon expérience ne suffisent pas à expliquer tout cela. Alors restez-en à votre opinion. J'espère que les développeurs n'iront pas jusqu'à le modifier.

 
Alexey Viktorov:

Encore une fois, pourquoi pensez-vous qu'il ne devrait pas y avoir une telle conversion ?

Je sais exactement pourquoi cette conversion se produit. Nous parlons ici d'une fonctionnalité, pas d'un bug.

 
Maxim Kuznetsov:
input est presque synonyme de const, const doit être initialisé

NULL est une initialisation. L'exemple montre volontairement une chaîne de caractères sans entrée.

 
fxsaber:
C'est une bonne idée de générer un avertissement au moment de la compilation.

Oui, ce comportement est probablement juste "infaillible".
Apparemment, comme une variable d'entrée doit être initialisée,= NULL est artificiellement assimilé à ="" lorsque la variable occupe déjà au moins un octet en mémoire.

Dans MQL5, les entrées :

string str=NULL;
string str;

sont absolument identiques. Aucune mémoire n'est allouée pour la variable. En tout cas, je n'ai pas trouvé de différences.
En java, par exemple, ces enregistrements sont légèrement différents, malgré le fait qu'aucune mémoire n'est allouée à la variable dans les deux cas également. La première variante (String str = null ;) sera considérée comme initialisée, bien qu'aucune mémoire ne soit allouée pour la variable et que la variable puisse être imprimée comme vide. Dans le second cas (String str ;), lorsque vous essayez d'imprimer la variable, une erreur de variable non initialisée sera générée.
C'est-à-dire que MQL5 est plus tolérant à cet égard.
Lequel est le mieux, je ne le sais même pas.

 
Nikolai Semko:

Apparemment, parce qu'une variable d'entrée doit être initialisée, le= NULL est artificiellement assimilé à = "", alors que la variable occupe déjà au moins un octet en mémoire.

NULL n'est pas une initialisation, c'est une valeur. Vous pouvez assigner NULL à n'importe quelle variable chaîne non-const au milieu du code. Et il sera égal à NULL.

Input n'est pas égal à NULL parce qu'au démarrage, un fichier de configuration invisible est créé. À partir de ce fichier, les valeurs des variables sont "analysées" en entrées. L'analyse syntaxique ne peut pas produire NULL de toute façon et place donc une chaîne vide à cet endroit.

Seul input-string a ce comportement. Pour const-string et autres, c'est bien sûr parfait.
 
fxsaber:

NULL n'est pas une initialisation, mais une valeur. Vous pouvez attribuer la valeur NULL à n'importe quelle variable non-constante au milieu du code. Et il sera égal à NULL.

Input n'est pas égal à NULL parce qu'au démarrage un fichier set invisible est créé. À partir de ce fichier, les valeurs des variables sont "analysées" en entrées. L'analyse syntaxique ne produira pas du tout NULL et placera donc une chaîne vide à cet endroit.

Eh bien, c'est ce que je veux dire. Je suis d'accord.
Le seul problème est qu'il n'y a aucun intérêt à attribuer une valeur NULL à une chaîne de caractères au moment de la déclaration de la variable:

string str1 = NULL;
string str2;
PRINT((str1==NULL));   // true
PRINT((str2==NULL));   // true

Il est logique de faire cela pour remettre à zéro la variable déjà initialisée en mémoire.

 
Nikolai Semko:

Eh bien, c'est ce que je dis. Je suis d'accord.
Le seul problème est qu'il n'y a aucun intérêt à attribuer une valeur NULL à une chaîne de caractères au moment de la déclaration de la variable:

Cela n'a de sens que pour annuler une variable en mémoire.

#define  DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

Ici, l'initialisation par NULL a du sens.

 
fxsaber:

L'initialisation par NULL a du sens ici.

oui

Raison: