Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 497

 

Danke, aber ich habe den ersten Link schon gelesen und der zweite bestätigt die Logik, die ich beim Schreiben des Codes verwendet habe.

Allerdings verwirrt mich diese Aussage im zweiten Link "...Außerhalb dieser Schleife gibt es eine weitere Variable mit demselben Namen... "Daraus folgt, dass der Wert einer globalen Variablen gleich bleibt, auch wenn innerhalb des Blocks eine neue Variable mit demselben Namen deklariert wird, aber das ist Unsinn, denn wenn man eine neue Variable deklariert, wird der Wert der ersten gelöscht, dann verstehe ich nicht, was der Sinn ist, zwei verschiedene Variablen (lokal und global) zu verwenden und zu speichern, aber mit demselben Wert?

 
-Aleks-:

Danke, aber ich habe den ersten Link schon gelesen, und der zweite bestätigt die Logik, die ich beim Schreiben des Codes verwendet habe.

Allerdings verwirrt mich diese Aussage aus dem zweiten Link "...Außerhalb dieser Schleife gibt es eine weitere Variable mit demselben Namen... " Aber das ist Unsinn, denn wenn man eine neue Variable deklariert, wird der Wert der vorherigen gelöscht, dann ist mir nicht klar, welchen Sinn es hat, zwei verschiedene Variablen (lokal und global) zu verwenden und zu speichern, aber mit demselben Wert?

Meiner Meinung nach schreiben Sie Unsinn. Wenn Sie eine lokale Variable innerhalb einer Schleife oder Funktion deklarieren, wird der Wert einer globalen Variable mit demselben Namen nicht beeinflusst, aber der Compiler warnt Sie, dass Sie eine lokale Variable mit demselben Namen wie die bestehende globale Variable deklariert haben und dass die Arbeit innerhalb einer Funktion oder eines Codeblocks, dessen Geltungsbereich die neu deklarierte Variable einschließt, den Wert der globalen Variable nicht beeinflusst. Das Programm warnt Sie, damit Sie verstehen, dass es sich um eine neue Variable handelt, und damit Sie nicht erwarten, dass sich der Wert der globalen Variable ändert, nachdem Sie den Bereich des Blocks verlassen haben, in dem Sie eine neue Variable mit demselben Namen wie die bestehende globale Variable deklariert haben.

Einfach ausgedrückt: Alles, was in der Wohnung ist, gilt für alle Räume und wird von allen Räumen gemeinsam genutzt (globale Variable). Und alles, was sich in einem Raum befindet, gilt nur für diesen Raum und ist von anderen Räumen aus nicht sichtbar (es handelt sich um eine lokale Variable).

Noch einfacher? Ich bitte Sie:

Wenn Sie die Luft in der Toilette (vor Ort) verpesten, dann ist sie dort verpestet. In der Zwischenzeit weiß die ganze Wohnung (weltweit), dass es besser ist, nicht auf die Toilette zu gehen (als Ergebnis Ihrer Toilettenexperimente)... Aber die Luft ist ein Konzept für die ganze Wohnung, und alle Bewohner wissen um die verdorbene Luft in der Toilette. Gleichzeitig kann nur derjenige, der das Glück hat, auf der Toilette zu sein, alle Freuden der Veränderung der lokalen Umgebung auf engem Raum erleben (lokaler Einfluss des Werts der Variablen). Der Rest von uns weiß davon, spürt es aber nicht. Wenn Sie die Toilette verlassen, verlieren Sie die Empfindungen (lokale Werte), die Sie in der Toilette erlebt haben, und beginnen, frische Luft zu atmen (erhalten die globalen Werte der Luft), während Sie wie alle anderen wissen, dass es einen Tritt in die Hose gibt (das Ergebnis der Luftverschmutzungsfunktion, die das gesamte Leben der Wohnung beeinflusst)...

Ich hoffe, ich habe mich klar ausgedrückt

 
Artyom Trishkin:

Ich glaube, Sie schreiben Unsinn. Wenn Sie eine lokale Variable innerhalb einer Schleife oder Funktion deklarieren, wird der Wert der globalen Variable mit demselben Namen nicht überschrieben, aber der Compiler warnt Sie, dass Sie eine lokale Variable mit demselben Namen wie die bestehende globale Variable deklariert haben, und die Arbeit innerhalb einer Funktion oder eines Codeblocks, dessen Geltungsbereich die neu deklarierte Variable einschließt, hat keinen Einfluss auf den Wert der globalen Variable. Das Programm warnt Sie, damit Sie verstehen, dass es sich um eine neue Variable handelt, und damit Sie nicht erwarten, dass sich der Wert der globalen Variable ändert, nachdem Sie den Bereich des Blocks verlassen haben, in dem Sie eine neue Variable mit demselben Namen wie die bestehende globale Variable deklariert haben.

Einfach ausgedrückt: Alles, was in der Wohnung ist, gilt für alle Räume und wird von allen Räumen gemeinsam genutzt (globale Variable). Und alles, was sich in einem Raum befindet, gilt nur für diesen Raum und ist von anderen Räumen aus nicht sichtbar (es handelt sich um eine lokale Variable).

Noch einfacher? Ich bitte Sie:

Wenn Sie die Luft in der Toilette (vor Ort) verpesten, dann ist sie dort verpestet. Inzwischen weiß die ganze Wohnung (weltweit), dass es besser ist, nicht auf die Toilette zu gehen (das Ergebnis deiner Toilettenexperimente)... Aber die Luft ist ein Konzept für die ganze Wohnung, und alle Bewohner wissen um die verdorbene Luft in der Toilette. Gleichzeitig kann nur derjenige, der das Glück hat, auf der Toilette zu sein, alle Freuden der Veränderung der lokalen Umgebung auf engem Raum erleben (lokaler Einfluss des Wertes der Variablen). Der Rest von uns weiß davon, spürt es aber nicht. Wenn Sie die Toilette verlassen, verlieren Sie die Empfindungen (lokale Werte), die Sie in der Toilette erlebt haben, und beginnen, frische Luft zu atmen (erhalten die globalen Werte der Luft), während Sie, wie alle anderen, wissen, dass es einen Tritt in die Hose gibt (das Ergebnis der Luftverschmutzungsfunktion, die das gesamte Leben der Wohnung beeinflusst)...

Ich hoffe, ich habe mich klar ausgedrückt

Ich habe die Wahrheit in Ihrem Werk entdeckt - danke! Es stellt sich heraus, dass die Deklaration einer Variablen innerhalb eines Blocks mit demselben Namen wie die globale Variable dazu führt, dass die Daten der globalen Variable innerhalb des Blocks gesperrt werden... Und die Warnung über die bereits deklarierte Variable kann nicht entfernt werden, richtig?
 
-Aleks-:
Ich habe die Wahrheit in Ihrem Werk entdeckt - danke! Es stellt sich heraus, dass die Deklaration einer Variablen innerhalb eines Blocks mit demselben Namen wie die globale Variable dazu führt, dass Daten aus der globalen Variable innerhalb des Blocks blockiert werden... und die Warnung, dass die bereits deklarierte Variable nicht entfernt werden kann, richtig?
Richtig.
 
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;
     }
//---
  }
In der Referenz wird es nicht korrekt wiedergegeben
 
-Aleks-:

Danke, aber ich habe den ersten Link schon gelesen, und der zweite bestätigt die Logik, die ich beim Schreiben des Codes verwendet habe.

Allerdings verwirrt mich diese Aussage aus dem zweiten Link "...Außerhalb dieser Schleife gibt es eine weitere Variable mit demselben Namen... "Aber das ist Unsinn, denn wenn man eine neue Variable deklariert, wird der Wert der vorherigen gelöscht, und dann ist mir nicht klar, welchen Sinn es hat, zwei verschiedene Variablen (lokal und global) zu verwenden und zu speichern, aber mit demselben Wert?

Leider ist es nicht richtig geschrieben :(

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:

Leider ist es dort falsch geschrieben :(

Gut, gut, können Sie die Ausgabe in Buchstaben machen, denn ich kann den Code gerade nicht erkennen.
 
pako:
Das steht nicht direkt in der Hilfe.
Warum geben Sie mir den Code? Ich weiß nicht, was ich darin suchen soll... ...und ich habe nicht viel Zeit. Können Sie mir sagen, wofür das ist und was mit der Hilfe nicht stimmt?
 
Artyom Trishkin:
Warum geben Sie mir den Code? Ich weiß nicht, was ich darin suchen soll... ...und ich habe nur wenig Zeit. Können Sie mir sagen, wofür es gedacht ist und was der Fehler in der Hilfe ist.

ist der Code aus der Hilfe

ist "i" am Anfang der Funktion

In der Schleife heißt es dann wieder "i".

 
pako:

ist der Code aus der Hilfe

ist "i" am Anfang der Funktion

In der Schleife ist es dann wieder "i".

Nun, es gibt keinen Fehler: eine Schleife mit globalem i (blau), und eine weitere Schleife mit lokalem i (rot)

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;
     }