Erreurs, bugs, questions - page 2890

 
Valeriy Yastremskiy:

C'est vrai, c'est un bug. Il s'avère que soit on donne un avertissement pour attribuer des variables aux non-initiés dans tous les cas, soit on ne le donne pas, mais on l'initie avec un zéro par défaut par exemple, au sein de la langue dans tous les mêmes cas.

Où seulement dans les exemples ci-dessus avez-vous vu de tels cas ?

 
A100:

Où seulement dans les exemples ci-dessus avez-vous vu de tels cas ?

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

Bugs, bugs, questions

A100, 2020.10.27 16:11

Vous devez l'initialiser, mais seulement avec une valeur significative. Il n'y a pas de telle valeur dans l'exemple ci-dessus, donc la pratique n'est pas mauvaise, c'est la seule possible. Sinon, il y aurait une double initialisation

int f( int i ) { /*вычисления*/ }
void g( int k )
{
        for ( int i = 0, j; i < k; i = j )
        {
                j = f( i );
                /*вычисления*/
        }
}

 
Roman:

Et où se trouvel'affectation des variables non initialisées ? Quelle est la variable non initialisée ? et à qui est-elle affectée ? Ce que vous avez mis en évidence : j de = à gauche j=, pas à droite =j, c'est-à-dire qu'il n'est affecté à personne avant d'être lui-même affecté à une valeur.

 
A100:

Où seulement dans les exemples ci-dessus avez-vous vu de tels cas ?

Oui, ça m'a échappé, dans tous les cas, la variable non initialisée a une affectation, et non l'inverse. Peut-être que le compilateur va de haut en bas dans une rangée, auquel cas oui, l'affectation est en bas et vice versa en haut. Il y a également un avertissement concernant une éventuelle affectation à une variable non initialisée.

 
A100:

Et où se trouvel'affectation des variables non initialisées ? Quelle est la variable non initialisée et à qui est-elle affectée ? Ce que vous avez mis en évidence est j=, et non =j

Assignation à une variable non initialisée, dans le corps de la boucle. Avant la première itération, j n'est pas encore initialisé.
Il sera initialisé après le passage de la première itération.
Le corps de la boucle est exécuté en premier, puis la portée incrémentielle. Que vous avez remplacé par i = j

 
Roman:

Assignation à une variable non initialisée, dans le corps de la fonction. Avant la première itération, j n'est pas encore initialisé.
Il sera initialisé après la première itération.
Le corps de la fonction est exécuté en premier, puis la zone d'incrémentation. Que vous avez remplacé par i = j

Non, c'est vrai, ne pas inférer j à la première itération est initié juste j=f(i) et à la seconde ce sera seulement i=j Je pense que le compilateur analyse de haut en bas et donne des avertissements.

 
Valeriy Yastremskiy:

Non, c'est vrai, la variable j n'est pas initialisée à la première itération juste j=f(i) et à la deuxième itération seulement i=j Je pense que le compilateur analyse de haut en bas et donne des avertissements.

Oui, mais avant la première itération, la variable j n'est pas encore initialisée, c'est ce que jure le compilateur.

 
Valeriy Yastremskiy:

Oui, c'est faux, dans tous les cas de variable non initialisée il y a une affectation, et non l'inverse. Peut-être que le compilateur va de haut en bas, donc oui, l'affectation est en bas et vice versa en haut. Il y a également un avertissement concernant une éventuelle affectation à une variable non initialisée.

Cela peut être le cas lorsque le compilateur ne dispose d'aucune information objective :

void f( int& i ) { /*вычисления*/ }
void OnStart()
{
        int i;
        f( i );
        int j = i; //нормально ??? а если i не инициализирована?
        printf("%d",j);
}

c'est à dire que peut-être f() initialisait i et peut-être pas. Et ici, le compilateur C++ donne un avertissement, alors que celui de MQL ne le fait pas.

 
A100:

Cela peut être le cas lorsque le compilateur ne dispose objectivement d'aucune information :

i.e. peut-être que f() avait i initialisation, peut-être pas. Et ici le compilateur C++ donne un avertissement, MQL ne le fait pas.

Je ne peux pas savoir ce qu'ils disent. Je pense à un compilateur plus simple. Analyse la syntaxe du modèle de haut en bas à la recherche d'erreurs syntaxiques évidentes, de non-respect des types et d'utilisation de variables erronées. Lorsque dans le second exemple l'initialisation a été posée, elle n'a pas généré d'avertissement. Bien que l'exécution du programme soit identique.

 
A100:

Cela peut être le cas lorsque le compilateur ne dispose objectivement d'aucune information :

c'est-à-dire que f() peut avoir initialisé i ou ne pas l'avoir fait. Et dans ce cas, le compilateur C++ donne un avertissement, mais pas le compilateur MQL.

En C++, les adresses des cellules de mémoire ne sont pas cachées, c'est pourquoi la variable est initialisée avec des déchets.
Dans Mql, les adresses des cellules de mémoire sont cachées et ne sont pas accessibles. C'est ainsi que le développeur de Mql s'est trompé dans le compilateur ;))

En bref, initialisez toujours les variables et vous n'aurez pas de mal de tête.