MetaTrader 4 Build 529 beta publié avec un nouveau compilateur - page 17

 
Barbarian:

Est-ce que ça marchait avant ? Je n'arrive pas à comprendre où tu déclares la variable i :


Dans les variables globales, j'initialise i une fois et je l'utilise ensuite dans toutes les boucles, c'est plus pratique et plus facile ...
 
ALXIMIKS:

Est-ce que c'est censé être le cas lorsque vous modifiez les paramètres d'un indicateur qui est déjà en cours d'exécution et qui fonctionne, en double-cliquant dessus,

l'indicateurne met pas à jour les variables statiques, il n'est donc pas redessiné ?


Les variables statiques conservent leur valeur lors de la réinitialisation du programme. Les valeurs ne sont pas sauvegardées uniquement lorsque le programme est retiré du tableau et réintroduit. Pour réinitialiser les variables statiques lors de la réinitialisation, j'utilise cette construction :

bool g_init;

void OnInit()
{
   g_init = true;
}

void MyFunction()
{
   static int myStatic;
   if (g_init)
   {
      myStatic = 0;
      g_init = false;
   }
}
 
VOLDEMAR:
C'est ainsi que cela fonctionne ...

Cela ne fonctionne pas de cette manière.


Dans le second cas, la portée du tableau déclaré dans la fonction est une fonction.

Dans le code

for(i=Coment-1; i>=1; i--){info[i]=info[i-1]; cv  [i]=cv  [i-1];}info[0]=txt;cv[0]=et;


êtes-vous sûr d'avoir initialisé tous les éléments du tableau avec les valeurs txt et et ? Peut-être que les 2 dernières affectations devraient venir avant la boucle et que la boucle devrait être construite différemment. Ou est-ce une telle idée ?

 
Scriptong:


Les variables statiques conservent leur valeur lors de la réinitialisation d'un programme. Les valeurs ne sont pas conservées uniquement lorsque le programme est retiré du tableau et remis en place. Pour réinitialiser les variables statiques lors de la réinitialisation, j'utilise la construction suivante :


Donc maintenant je dois chercher dans la bibliothèque et tout réécrire ? C'est absurde, parce que tout allait bien dans 509, et ici .......
 
alexvd:


Dans le second cas, la portée d'un tableau déclaré dans une fonction est une fonction.

Dans le code.


Etes-vous sûr que vous initialisez tous les éléments du tableau avec txt et et ? Les deux dernières affectations devraient probablement venir avant la boucle. Ou est-ce une idée ?


Le texte est d'abord déplacé d'un niveau dans la boucle, puis les valeurs nulles sont attribuées au nouveau texte...

Ces tableaux ne sont utilisés que dans les fonctions que j'ai présentées ci-dessus ...

Auparavant, dans les versions 509 et antérieures, tout fonctionnait dans les deux cas ... Maintenant, seulement dans le premier cas ...

 
ALXIMIKS:

Quel est l'intérêt de fouiller dans la bibliothèque et de tout réécrire ? C'est absurde, car tout allait bien en 509 et maintenant c'est .......


Il est simplement préférable d'initialiser toutes les variables à utiliser dans le code au début du code...

Cela simplifie le travail, et permet de voir et de réinitialiser correctement les variables au début du programme et de les utiliser ensuite ...

 
ALXIMIKS:

Est-ce que c'est censé être le cas lorsque vous modifiez les paramètres d'un indicateur qui est déjà en cours d'exécution et qui fonctionne, en double-cliquant dessus,

l'indicateurne met pas à jour les variables statiques, c'est pourquoi il n'est pas redessiné ?

Autant que je me souvienne, c'était toujours comme ça (dans la version 509 pour sûr). C'est un bug.

VOLDEMAR:

J'ai remarqué un phénomène étrange sur différents ordinateurs, l'un avec XP et l'autre avec W 7.

Lors de l'initialisation d'un tableau dans une fonction, le tableau n'est pas rempli avec la valeur entière, seulement avec la valeur 0 ...

Lors de l'initialisation d'un tableau au niveau global au-delà de toutes les fonctions, les tableaux sont remplis complètement comme il se doit ...

On l'a dit des milliers de fois - initialiser les tableaux et les variables de manière explicite, ne pas attendre les "bénédictions célestes".

En cas de déclaration locale, vous avez juste de la chance et ils ne reçoivent pas de déchets. Mais je ne compterais pas dessus.

 
Veuillez noter que le nouveau compilateur et le nouvel environnement d'exécution contrôlent la qualité du code de manière beaucoup plus stricte. Une grande partie du code MQL4 a été écrite par des développeurs tiers avec les mains baissées, et maintenant ces failles seront immédiatement visibles.
 

Corrigez-moi si je me trompe.

J'utilise une fonction de bibliothèque dans un indicateur, cette fonction déclare quelques variables statiques qui participent au calcul du tableau de l'indicateur.

Si je veux modifier les paramètres de l'indicateur afin de corriger le calcul de l'indicateur (en fonction des variables statiques),

passer le drapeau à la fonction de la bibliothèque qui est responsable de la réinitialisation (vous devez développer les paramètres d'entrée de chaque fonction qui a des variables statiques).

effectuer la mise à zéro des variables statiques dans le corps, et ne pas oublier d'enlever le drapeau avant de terminer le calcul.

Ce serait beaucoup plus facile si les variables statiques avaient un paramètre, défini lors de leur déclaration, responsable de la remise à zéro de ces variables lors de la réinitialisation.

 
Renat:
Veuillez noter que le nouveau compilateur et le nouveau runtime sont beaucoup plus stricts dans le contrôle de la qualité du code. Beaucoup de code MQL4 a été écrit par des développeurs tiers et maintenant ces défauts seront immédiatement visibles.
Le manuel du MQL4 (qui se trouve dans l'éditeur) a-t-il également été mis à jour en conséquence ?
Raison: