Erreurs, bugs, questions - page 168

 
Manov:

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

Qu'est-ce que cela dit si

Si la variable est initialisée avec quelque chose, l'avertissement disparaît. Mais comme vous pouvez le constater par vous-même, l'initialisation de la variable 'local_low' dans ce fragment de code est inutile. L'avertissement n'interfère donc pas du tout avec la vie.
 
Renat:

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.

:) Comme je ne serai jamais à la tête d'une société de logiciels, je resterai à jamais au niveau de "n'importe quel programmeur" (c'est-à-dire un programmeur amateur, selon ma conception).

...Et comme le programmeur amateur n'obtient jamais une description logique de l'erreur, il en conclut que soit il n'y a tout simplement pas d'erreur dans son bout de code, soit l'erreur est si compliquée que personne ne peut la décrire dans le langage de la logique. À ce stade, nous pouvons considérer que les deux parties se comprennent, la question est close.

 
Yedelkin:
Si la variable est initialisée avec quelque chose, l'avertissement disparaît. Mais, comme vous pouvez le constater par vous-même, l'initialisation de la variable local_low est redondante dans ce morceau de code. L'avertissement n'interfère donc pas du tout avec la vie.
Un code concret est probablement oui. mais le compilateur devra être aussi"infaillible" que possible.
 
Alors, le moniteur s'est enflammé et a dit au programmeur : ne jamais cacher l'initialisation derrière une condition, ne jamais utiliser une variable de boucle après le corps de la boucle, vérifier la division par zéro, ne pas multiplier inutilement les entités, ne pas écrire if (a==true) ....
 
Manov:
... Le compilateur devra être aussi"infaillible" que possible.
Je ne discute pas de ça. C'est un avertissement utile. Plus vous disposerez de ces avertissements, mieux vous comprendrez votre propre code.
 
Vigor:
... ne pas écrire si (a==vrai) ...

A propos, au printemps j'ai eu une formation Expert Advisors, dans laquelle, ayant lu beaucoup de littérature, j'ai inséré des conditions du type if(a). Mais les experts n'ont commencé à travailler qu'après avoir remplacé ces conditions par des conditions du type if (a==true). Maintenant, j'ai du mal à me défaire de cette habitude.
 
Yedelkin:

Mais en raison de l'utilisation de l'interrupcion de la variable bool à la ligne 9 juste après l'initialisation de la variable local_low à la ligne 8, il s'avère qu'à la ligne 15, l'initialisation de la variable local_low sera garantie . Donc, à ce stade, l'avertissement "possible use of uninitialized variable 'local_low'" ne signifie pas "garanti" mais juste la présence possible d'une branche de passage dans laquelle la variable n'est pas initialisée.
Dans votre exemple, si Ac-k=0 , l'opérateur for ne sera pas exécuté du tout et local_low sera garanti non initialisé. Ou c'est faux ?
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 

Si nous envoyons une demande pour modifier une position avec les mêmes arrêts, nous obtiendrons une erreur. Mais si vous envoyez une requête pour modifier un ordre en attente avec les mêmes paramètres, la requête sera exécutée. Est-ce que c'est ainsi que nous l'avons prévu et que nous n'avons pas besoin de vérifier les paramètres pour des changements ?

Pourquoi encombrer le serveur de demandes inutiles, par exemple en cas d'erreur dans le conseiller expert ou de logique incorrecte de son fonctionnement ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
Valmars:
Dans votre exemple, si Ac-k=0 , alors l'instruction for ne sera pas exécutée du tout et local_low est garanti non initialisé. Ou c'est faux ?

C'est exactement ça. Si Ac-k<=1, l'opérateur for ne doit pas être exécuté du tout et la variable local_low est garantie de rester non initialisée. Mais puisque la variable bool interrupcion restera fausse (ligne 3), la condition de la ligne 13 signifie que la variable non initialisée local_low ne sera jamais (ne devrait jamais) être utilisée dans les calculs. En particulier, une expression avec la variable local_low de la ligne 15 ne doit pas être évaluée [à moins, bien sûr, que l'instruction if fonctionne exactement comme indiqué dans l'aide :) ].

En d'autres termes, si l'on garantit que la variable local_low n'est pas initialisée, on garantit également qu'elle ne sera pas (ne devrait pas) être utilisée dans les calculs.

 

void Graf()
{
if(ObjectFind(0, "H")<0) ObjectCreate(0, "H",OBJ_HLINE
,0,0,h,0) ;
if(ObjectFind(0, "L")<0
)
0) ObjectCreate(0, "L",OBJ_HLINE,0,0,l,0)
; ObjectSetDouble(0, "H",OBJPROP_PRICE,h)
; ObjectSetDouble(0, "L",OBJPROP_PRICE,l)
;
string bal = DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE),2)
;string equ = DoubleToString (AccountInfoDouble(ACCOUNT_EQUITY),2)
; string spread = DoubleToString(((Ask-Bid)/_Point),0)
; string space = ""
; string info= bal+espace+equ+espace+spread
;
if (ObjectFind(0, "info")<0) ObjectCreate(0, "info",OBJ_LABEL,0,0,0)
; ObjectSetInteger(0, "info",OBJPROP_XDISTANCE,0)
;ObjectSetInteger(0, "info",OBJPROP_YDISTANCE,15)
; ObjectSetString(0, "info",OBJPROP_TEXT,info)
;ObjectSetInteger(0, "info",OBJPROP_FONTSIZE,36)
; ObjectSetInteger(0, "info",OBJPROP_COLOR,Maroon)
; return
; }

Voici un bout de code. La fonction imprime les valeurs du solde, de l'équité et du spread à chaque tick. Mais l'information est affichée pour une raison quelconque, pas pour le tick précédent... Veuillez m'aider à comprendre pourquoi ? Dans MT4, un code similaire change les valeurs à chaque nouveau tick, et dans MT5, avec un nouveau tick, les informations sont affichées pour le tick précédent.
Raison: