Erreurs, bugs, questions - page 167

 

Question sur les tableaux dynamiques

double open_main_array[] - variable de classe

initialisation

ArraySetAsSeries(open_main_array,true) ;

Le 1er appel de la fonction qui contient le code suivant

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array) ;

2ème appel de la fonction

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array) ;

Le tableau open_main_array contiendra-t-il les données copiées lors du 2ème appel ou le tableau sera-t-il incrémenté et contiendra-t-il les données des 1er et 2ème appels ?

Alternativement, vous pouvez utiliser :

ArrayFree(open_main_array)

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array) ;

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

variable non initialisée - signifie que la variable est garantie d' avoir une branche de passage lorsqu'elle est non initialisée. par exemple, default est explicitement omis dans switch, dans lequel MainPrice devrait être explicitement initialisé (ou explicitement mis à zéro lorsqu'il est déclaré).

A propos de la "passe garantie". Voici un tel morceau de code :

            (1)         double local_low;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion=false;
            (4)         for(uint n=1;n<Ac-k;n++)
            (5)           {
            (6)            if(low[index_interior-n]<low[index_interior-n-1])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion=true;
            (10)              break;
            (11)              }
            (12)          }  
            (13)        if(interrupcion)
            (14)          {
            (15)           if(EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

Pour la dernière ligne (ligne 15), il est dit "possible use of uninitialized variable 'local_low'".

Mais à cause de l'utilisation de la variable bool interrupcion à la ligne 9 juste après avoir initialisé la variable local_low à la ligne 8, il s'avère qu'à la ligne 15 la variable local_low sera garantie initialisée. Donc, à ce stade, l'avertissement "possible use of uninitialized variable 'local_low'" ne signifie pas "garanti", mais seulement l'existence possible d'une branche de passage dans laquelle la variable n'est pas initialisée.

 
Yedelkin:

A propos du "passage garanti". Voici un morceau de code :

Pour la dernière ligne (ligne 15), il est dit "possible use of uninitialized variable 'local_low'".

Mais à cause de l'utilisation de la variable bool interrupcion à la ligne 9 juste après avoir initialisé la variable local_low à la ligne 8, il s'avère qu'à la ligne 15 la variable local_low sera garantie initialisée. Ainsi, à l'heure actuelle, l'avertissement "possible use of uninitialized variable 'local_low'" ne signifie pas "garanti" mais juste la présence possible d'une branche de passage où la variable n'est pas initialisée.

C'est exactement ça, ça vous donne un avertissement.

Ne confondez pas votre complaisance avec la réalité. La réalité est révélée après de nombreux projets et la compréhension du fait que "cela ne peut pas être parce que la logique mène à untel ou à untel" se produit tous les jours.

 
Renat:

Ne confondez pas votre confiance en vous avec la réalité. La réalité se révèle après de nombreux projets et la prise de conscience que "cela ne peut pas être parce que la logique mène à untel ou untel" se produit quotidiennement.

Pouvez-vous obtenir une explication adéquate ? Le code est donné, la déclaration "moralisatrice" est énoncée, où est l'erreur ? Je ne comprends pas l'ésotérisme.

...Si l'on considère la traduction de la phrase" utilisationpossible d'une variable non initialisée", l'avertissement est en effet émis "absolument correct". Mais il ne s'agit pas de "garantie", mais simplement de l'existence possible d'une branche d'une passe où la variable n'est pas initialisée. C'est exactement ce dont je parle "en toute confiance".

 
Yedelkin:

Pouvons-nous obtenir une explication adéquate ? Le code est donné, la déclaration "moralisatrice" est énoncée, où est l'erreur ? Je ne comprends pas l'ésotérisme.

Et si, au lieu de

interrupcion=true;

au lieu de (par exemple)...

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
Voulez-vous aussi faire une réclamation ? Surtout si une certaineFonctionN consiste en des centaines de lignes de code ?

Selon votre morceau de code, oui, la variable est initialisée si la ligne 15 est exécutée. Mais que diriez-vous au compilateur de faire dans l'exemple que j'ai donné ? La tâche est difficile. Et il n'y a pas besoin de la résoudre non plus.

L'erreur s'appelle" utilisationpossible (peut-être) d'une variable non initialisée" (bien que vous le sachiez de toute façon).

Vous feriez mieux d'assigner explicitement une valeur à la variable local_low. Croyez-moi, cela peut vous éviter d'éventuelles erreurs à l'avenir (le code est corrigé, quelque chose est supprimé, quelque chose est déplacé, quelque chose est modifié, et la ligne 13 peut tomber au cours de ce processus).

 
Yedelkin:

Pouvons-nous obtenir une explication adéquate ? Le code est donné, la déclaration "moralisatrice" est énoncée, où est l'erreur ? Je ne comprends pas l'ésotérisme.

Dans le monde réel, lorsque la grande majorité des programmeurs, quel que soit le langage, écrivent du code complètement non protégé et glitchy, les compilateurs doivent être aussi rigoureux que possible. La complaisance des programmeurs "la logique est claire, il ne devrait pas y avoir de problèmes, tout est initialisé comme il se doit" a entraîné, entraîne et entraînera encore de nombreuses erreurs.

C'est pourquoi les questions sur la critique des mesures strictes ne sont pas pertinentes ici.

 
Renat:

... La confiance en soi des programmeurs "la logique est claire, il ne devrait pas y avoir de problèmes, tout est initialisé correctement" a apporté, apporte et apportera un nombre énorme d'erreurs.

C'est pourquoi la critique des mesures strictes n'est pas pertinente ici.

Faisons l'économie de la critique. D'autant plus que je ne l'ai pas formulé dans mes mots. Et concernant la présence de critiques de ma part, vous vous trompez profondément.

Alors, quelle est votre erreur ? Puisque vous ne pouvez pas mettre l'ésotérisme dans un code, veuillez me répondre sur le langage de la logique. C'est-à-dire dans un langage que tout programmeur peut comprendre.

 
notused:

feriez-vous aussi une réclamation ? Surtout si une certaineFonctionN consiste en des centaines de lignes de code ?

Vous êtes aussi au même endroit. Eh bien, je n'ai pas à me plaindre. Je veux juste préciser que tout n'est pas aussi catégorique que le dit Renat.

Qu'en est-il du code. Je vous ai donné un exemple spécifique de code qui réfute le caractère catégorique de la déclaration de Renat en utilisant la logique ordinaire. Merci pour les conseils, j'essaie de m'améliorer en permanence.

 
Yedelkin:

Passons outre les critiques. D'autant plus que je ne l'ai pas formulé dans mes mots. Quant à l'existence d'une critique de ma part, vous vous trompez lourdement.

Alors, quelle est votre erreur ? Puisque vous ne pouvez pas mettre l'ésotérisme dans un code, veuillez me répondre sur le langage de la logique. C'est-à-dire dans un langage que tout programmeur peut comprendre.

Vous avez"utilisation possible d'une variable non initialisée 'local_low'".

Et qu'est-ce que vous obtenez si

(1)         double local_low=1.1; // или что-то другое
 
Yedelkin:

Alors, qu'est-ce qu'une erreur ? Puisque vous ne pouvez pas mettre l'ésotérisme dans le code, veuillez répondre dans le langage de la logique. C'est-à-dire dans un langage que tout programmeur peut comprendre.

Relisez mes réponses du point de vue d'un directeur d'entreprise de logiciels qui a mis sur le marché de nombreux projets de logiciels.

Sinon, en restant au niveau de "n'importe quel programmeur", vous ne comprendrez pas quelle est l'erreur.