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

 
printf("%s , %f , %i",(string)NULL,(double)NULL,(int)NULL);

2020.01.27 01:15:57.859 tst (EURUSD,H1) (null) , 0.000000 , 0

Si je supprime la conversion de type, l'expression 'NULL' du type 'void' est illégale.

intéressant, il s'avère que la chaîne nput peut être initialisée void

 
fxsaber:

NULL est une initialisation. L'exemple montre volontairement une chaîne de caractères qui n'a pas été saisie.

NULL / NIL (en d'autres termes) ne peut pas être une initialisation d'une entité de type chaîne constante.

Au moins parce que la chaîne mql n'est pas un "pointeur" comme en C. Il n'a pas d'état spécial "rien du tout".

PS (oh, je ne m'attendais pas à cela de ma part)

 
Maxim Kuznetsov:

Elle n'a pas d'état spécial de "rien du tout".

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Particularités de mql5, trucs et astuces

fxsaber, 2020.01.26 15:54

void OnStart()
{
  uchar Bytes[];

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

J'utilise cet état tous les jours.

 
Maxim Kuznetsov:

au moins parce qu'une chaîne mql n'est pas un "pointeur" comme en C. Il n'a pas d'état spécial "rien du tout".

PS (oh, je ne m'attendais pas à ça de ma part).

hélas non, une chaîne en MQL est une entité avec de la mémoire allouée.@Ilyas a expliqué pourquoi StringBufferLen() peut ne pas montrer la longueur de la chaîne, mais montre la mémoire utilisée pour stocker la chaîne.


fxsaber:

J'utilise cet état tous les jours.

Ce n'est pas un indicateur du tout, dans MQL4 je désinsère les pointeurs de n'importe quel objet en utilisant StringConcatenate(), c'est-à-dire que le travail des fonctions intégrées n'est pas implémenté par les règles de MQL ;)))

input string s = NULL;
void OnStart()
{
   uchar Bytes[];
  Print(StringToCharArray(NULL, Bytes));  // 0
  Print(StringToCharArray("", Bytes));    // 1
  Print(StringToCharArray(s, Bytes));     // 1
}
 
Igor Makanu:

Dans MQL4, j'annule les pointeurs vers n'importe quel objet en utilisant StringConcatenate(), c'est-à-dire que les fonctions intégrées ne sont pas implémentées par les règles MQL ;)))

Ça ne fait aucune différence ce qu'il y a à l'intérieur.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Particularités de mql5, trucs et astuces

Igor Makanu, 2020.01.26 22:27

input string s = NULL;
void OnStart()
{
   uchar Bytes[];

  Print(StringToCharArray(s, Bytes));     // 1
}
Parce que ce n'est pas NULL. C'est le sujet du message original.
 
fxsaber:

La façon dont elle est à l'intérieur ne fait aucune différence.

complété mon post par votre exemple


J'ai également fait quelques expériences supplémentaires avec la chaîne d'entrée s = NULL ;

d'après ce que j'ai compris, tant que nous n'essayons pas d'utiliser la valeur de la variable d'entrée - elle sera NULL, mais au moment où nous essayons d'attribuer une valeur à une autre variable ou simplement de la désactiver, NULL disparaîtra, c'est-à-dire que de la mémoire sera allouée à cette variable d'entrée

 
Igor Makanu:

si j'ai bien compris, tant que nous n'essayons pas d'utiliser la valeur d'une variable d'entrée - cette valeur est NULL, mais à ce moment-là, si nous essayons d'affecter la valeur de cette variable d'entrée à une autre variable ou simplement d'annuler cette variable d'entrée, alors ce NULL disparaîtra, c'est-à-dire que de la mémoire sera allouée à cette variable d'entrée

Le mécanisme de fonctionnement de la variable d'entrée a été décrit en détail ci-dessus.

 
fxsaber:

Ce qu'il y a à l'intérieur ne fait aucune différence.

Parce que ce n'est pas NULL. C'est le sujet du message original.

il y a (encore) une spécificité du déréférencement des entités (il n'y a pas de pointeurs dans mql, ce n'est pas du C, laissez les entités exister)

input est une constante déclarée au démarrage. Vous ne pouvez pas physiquement lui donner la valeur "NULL".

const string nothing=NULL; /// <--- ЭТО ЧТО ?

 
Nikolai Semko:

Oui, ce comportement est probablement juste "infaillible".
Apparemment, parce que la 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.

Dans MQL5, les entrées :

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.

Comment la mémoire n'est-elle pas allouée à une variable ?
La mémoire est allouée et la variable contient des déchets arbitraires.
Et du fait que la chaîne ne sort aucune valeur, il est logique que le tampon soit vide.

char   ch; 
short  sh;
int    in;
double db;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(in));
Print(sizeof(db));
Print(sizeof(st));
Print("---------------------");
Print(ch);
Print(sh);
Print(in);
Print(db);
Print(st);
 
Roman:

Comment la mémoire n'est-elle pas allouée à une variable ?
La mémoire est allouée, mais la variable ne contient pas de déchets arbitraires.
Et du fait que la chaîne ne sort aucune valeur, il est logique que le tampon soit vide.

char ch; 
short sh;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(st));

   string str1;
   string str2="Однажды, в студёную зимнюю пору я из лесу вышел; был сильный мороз.";
   Print(sizeof(str1));  // 12
   Print(sizeof(str2));  // 12
   uchar ch1[],ch2[];
   Print(StringToCharArray(str1, ch1));  // 0
   Print(StringToCharArray(str2, ch2));  // 68