Questions des débutants MQL5 MT5 MetaTrader 5 - page 497

 

Merci, mais j'ai déjà lu le premier lien et le second confirme la logique que j'ai utilisée pour écrire le code.

Cependant, je suis confus par cette déclaration dans le deuxième lien "...". Il y a uneautre variable avec le même nom en dehors de cette boucle... "Il s'ensuit que la valeur d'une variable globale reste la même malgré le fait qu'à l'intérieur du bloc une nouvelle variable avec le même nom sera déclarée, mais ce non-sens car si vous déclarez une nouvelle variable, la valeur de l'ancienne sera effacée, alors je ne comprends pas, quel est l'intérêt d'utiliser et de stocker deux variables différentes (locale et globale), mais avec la même valeur ?

 
-Aleks-:

Merci, mais j'ai déjà lu le premier lien, et le second a confirmé la logique que j'ai utilisée pour écrire le code.

Cependant, je suis confus par cette déclaration du deuxième lien "...".en dehors de cette boucle, il y a une autre variable avec le même nom... " Mais c'est un non-sens car si vous déclarez une nouvelle variable, la valeur de la précédente sera effacée, alors ce n'est pas clair pour moi, quel est l'intérêt d'utiliser et de stocker deux variables différentes (locale et globale), mais avec la même valeur ? ".

À mon avis, vous écrivez n'importe quoi. Si vous déclarez une variable locale à l'intérieur d'une boucle ou d'une fonction, la valeur d'une variable globale portant le même nom ne sera pas affectée, mais le compilateur vous avertira que vous avez déclaré une variable locale portant le même nom que la variable globale existante et que le fait de travailler à l'intérieur d'une fonction ou d'un bloc de code dont la portée inclut la variable nouvellement déclarée n'affectera pas la valeur de la variable globale. Il vous en avertit afin que vous compreniez qu'il s'agit d'une nouvelle variable et que vous ne vous attendiez pas à ce que la valeur de la variable globale change après avoir quitté la portée du bloc dans lequel vous avez déclaré une nouvelle variable portant le même nom que la variable globale existante.

En termes simples : tout ce qui se trouve dans l'appartement s'applique à toutes les pièces et est partagé par toutes les pièces (variable globale). Et tout ce qui se trouve à l'intérieur d'une pièce - cela ne s'applique qu'à la pièce et n'est pas visible des autres pièces (c'est une variable locale).

Encore plus simple ? S'il vous plaît :

Si vous perturbez l'air dans les toilettes (localement), c'est là que ça se passe. Pendant ce temps, tout l'appartement (au niveau mondial) sait (grâce à vos expériences sur les toilettes) qu'il vaut mieux ne pas aller dans les toilettes... Mais l'air est un concept pour tout l'appartement, et tous les résidents savent que l'air est vicié dans les toilettes. Dans le même temps, seule la personne chanceuse qui se trouve dans les toilettes peut profiter pleinement de tous les délices de la modification de l'environnement local dans l'espace confiné (influence locale de la valeur de la variable). Le reste d'entre nous le sait, mais ne le ressent pas. Lorsque vous sortez des toilettes, vous perdez les sensations (valeurs locales) que vous avez éprouvées dans les toilettes et vous commencez à respirer de l'air frais (vous obtenez les valeurs globales de l'air), tout en sachant, comme tout le monde, qu'il y a un coup de pied au cul (le résultat de la fonction de contamination de l'air, qui affecte la vie globale de tout l'appartement)...

J'espère que j'ai été clair

 
Artyom Trishkin:

Je pense que vous écrivez n'importe quoi. Si vous déclarez une variable locale à l'intérieur d'une boucle ou d'une fonction, la valeur de la variable globale portant le même nom ne sera pas écrasée, mais le compilateur vous avertira que vous avez déclaré une variable locale portant le même nom que la variable globale existante, et le fait de travailler à l'intérieur d'une fonction ou d'un bloc de code dont la portée inclut la variable nouvellement déclarée n'affectera pas la valeur de la variable globale. Il vous en avertit afin que vous compreniez qu'il s'agit d'une nouvelle variable et que vous ne vous attendiez pas à ce que la valeur de la variable globale change après avoir quitté la portée du bloc dans lequel vous avez déclaré une nouvelle variable portant le même nom que la variable globale existante.

En termes simples : tout ce qui se trouve dans l'appartement s'applique à toutes les pièces et est partagé par toutes les pièces (variable globale). Et tout ce qui se trouve à l'intérieur d'une pièce - cela ne s'applique qu'à la pièce et n'est pas visible des autres pièces (c'est une variable locale).

Encore plus simple ? S'il vous plaît :

Si vous perturbez l'air dans les toilettes (localement), c'est là que ça se passe. Pendant ce temps, tout l'appartement (globalement) sait (résultat de vos expériences sur les toilettes) qu'il est préférable de ne pas aller dans les toilettes... Mais l'air est un concept pour tout l'appartement, et tous les occupants savent que l'air est vicié dans les toilettes. Dans le même temps, seule la personne chanceuse qui se trouve dans les toilettes peut profiter pleinement de tous les délices de la modification de l'environnement local dans l'espace confiné (influence locale de la valeur de la variable). Le reste d'entre nous le sait, mais ne le ressent pas. Lorsque vous sortez des toilettes, vous perdez les sensations (valeurs locales) que vous avez éprouvées dans les toilettes et vous commencez à respirer de l'air frais (vous obtenez les valeurs globales de l'air), tout en sachant, comme tout le monde, qu'il y a un coup de pied au cul (le résultat de la fonction de contamination de l'air, qui affecte la vie globale de tout l'appartement)...

J'espère que j'ai été clair

J'ai découvert la vérité dans votre opus - merci ! Il s'avère que la déclaration d'une variable à l'intérieur d'un bloc avec le même nom que la variable globale entraîne le verrouillage des données de la variable globale à l'intérieur du bloc... Et l'avertissement concernant la variable déjà déclarée ne peut pas être supprimé, n'est-ce pas ?
 
-Aleks-:
J'ai découvert la vérité dans votre opus - merci ! Il s'avère que déclarer une variable à l'intérieur d'un bloc avec le même nom que la variable globale entraîne le blocage des données de la variable globale à l'intérieur du bloc... et l'avertissement concernant la variable déjà déclarée ne peut être supprimé, n'est-ce pas ?
Bien.
 
Artyom Trishkin:
void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int        i,limit;
   static int weightsum=0;
   double     sum=0;
//---
   if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }
   else
     {
      limit=prev_calculated-1;
     }
 
   for(i=limit;i<rates_total;i++)
     {
      sum=0;
      for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }
ce n'est pas dit correctement dans la référence
 
-Aleks-:

Merci, mais j'ai déjà lu le premier lien, et le second a confirmé la logique que j'ai utilisée pour écrire le code.

Cependant, je suis confus par cette déclaration du deuxième lien "...".en dehors de cette boucle, il y a une autre variable avec le même nom... "Mais ce non-sens parce que si vous déclarez une nouvelle variable, la valeur de l'ancienne sera effacée, alors il n'est pas clair pour moi, quel est l'intérêt d'utiliser et de stocker deux variables différentes (locale et globale), mais avec la même valeur ?

Malheureusement, ce n'est pas écrit correctement :(

void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int        i,limit;
   static int weightsum=0;
   double     sum=0;
//---
   if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }
   else
     {
      limit=prev_calculated-1;
     }
 
   for(i=limit;i<rates_total;i++)
     {
      sum=0;
      for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }
 
pako:

Malheureusement, c'est mal orthographié là :(

Bien, bien, pouvez-vous faire la sortie en lettres, parce que je ne reconnais pas encore très bien le code.
 
pako:
Ce n'est pas dit dans l'aide.
Pourquoi me donnez-vous le code ? Je ne sais pas ce qu'il faut y chercher... ...et je n'ai pas beaucoup de temps. Pouvez-vous me dire à quoi ça sert et ce qui ne va pas avec l'aide ?
 
Artyom Trishkin:
Pourquoi me donnez-vous le code ? Je ne sais pas ce qu'il faut y chercher... ...et je suis limité par le temps. Pouvez-vous me dire à quoi ça sert et quelle est l'erreur dans l'aide.

Voici le code de l'aide

est "i" au début de la fonction

puis dans la boucle, c'est à nouveau "i".

 
pako:

Voici le code de l'aide

est "i" au début de la fonction

puis dans la boucle c'est "i" à nouveau

Eh bien il n'y a pas d'erreur : une boucle avec i global (bleu), et une autre boucle avec i local (rouge)

if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {                           
         int k=i-begin+1;           
         weightsum+=k;              
         firstValue+=k*price[i];    
        }                           
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }
Raison: