Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 497

 

Gracias, pero ya he leído el primer enlace y el segundo confirma la lógica que utilicé al escribir el código.

Sin embargo, me confunde esta afirmación en el segundo enlace "... Hayotra variable con el mismo nombre fuera de este bucle... "Se deduce que el valor de una variable global sigue siendo el mismo a pesar de que dentro del bloque se declare una nueva variable con el mismo nombre, pero esto no tiene sentido porque si se declara una nueva variable, se borrará el valor de la anterior, entonces no entiendo, ¿qué sentido tiene utilizar y almacenar dos variables diferentes (local y global), pero con el mismo valor?

 
-Aleks-:

Gracias, pero ya había leído el primer enlace, y el segundo confirmó la lógica que utilicé al escribir el código.

Sin embargo, me confunde esta afirmación del segundo enlace "...fuera de este bucle hay otra variable con el mismo nombre... " Pero esto no tiene sentido porque si declaras una nueva variable, el valor de la anterior se borrará, entonces no entiendo, ¿qué sentido tiene usar y almacenar dos variables diferentes (local y global), pero con el mismo valor?

En mi opinión, estás escribiendo tonterías. Si declaras una variable local dentro de un bucle o función, el valor de una variable global con el mismo nombre no se verá afectado, pero el compilador te advertirá de que has declarado una variable local con el mismo nombre que la variable global existente y trabajar dentro de una función o bloque de código cuyo ámbito incluya la variable recién declarada no afectará al valor de la variable global. Te advierte de ello para que entiendas que se trata de una nueva variable, y para que no esperes que el valor de la variable global cambie después de salir del ámbito del bloque en el que declaraste una nueva variable con el mismo nombre que la variable global existente.

En términos sencillos: todo lo que está dentro del piso se aplica a todas las habitaciones y es compartido por todas ellas (variable global). Y todo lo que está dentro de una habitación - sólo se aplica a la habitación y no es visible desde otras habitaciones (es una variable local).

¿Aún más sencillo? Por favor:

Si se estropea el aire en el baño (localmente), ahí se estropea. Mientras tanto, todo el piso (globalmente) sabe (a raíz de tus experimentos con el retrete) que es mejor no entrar en el retrete... Pero el aire es un concepto para todo el piso, y todos los residentes saben del aire viciado en el baño. Al mismo tiempo, sólo la persona afortunada que se encuentra en el retrete puede experimentar plenamente todas las delicias del cambio del entorno local dentro del espacio confinado (influencia local del valor de la variable). Los demás lo sabemos, pero no lo sentimos. Al salir del retrete, se pierden las sensaciones (valores locales) que se experimentaban en el retrete y se empieza a respirar aire fresco (se obtienen los valores globales del aire), sabiendo al mismo tiempo, como todo el mundo, que hay una patada en los pantalones (resultado de la función de contaminación del aire, que afecta a la vida global de todo el piso)...

Espero haber sido claro

 
Artyom Trishkin:

Creo que estás escribiendo tonterías. Si declaras una variable local dentro de un bucle o función, el valor de la variable global con el mismo nombre no se sobrescribirá, pero el compilador te advertirá de que has declarado una variable local con el mismo nombre que la variable global existente, y trabajar dentro de una función o bloque de código cuyo ámbito incluya la variable recién declarada no afectará al valor de la variable global. Te advierte de ello para que entiendas que se trata de una nueva variable, y para que no esperes que el valor de la variable global cambie después de salir del ámbito del bloque en el que declaraste una nueva variable con el mismo nombre que la variable global existente.

En términos sencillos: todo lo que está dentro del piso se aplica a todas las habitaciones y es compartido por todas ellas (variable global). Y todo lo que está dentro de una habitación - sólo se aplica a la habitación y no es visible desde otras habitaciones (es una variable local).

¿Aún más sencillo? Por favor:

Si se estropea el aire en el baño (localmente), ahí se estropea. Mientras tanto, todo el piso (globalmente) sabe (resultado de tus experimentos con el retrete) que es mejor no entrar en el retrete... Pero el aire es un concepto para todo el piso, y todos los ocupantes saben del aire viciado en el baño. Al mismo tiempo, sólo la persona afortunada que se encuentra en el retrete puede experimentar plenamente todas las delicias del cambio del entorno local dentro del espacio confinado (influencia local del valor de la variable). Los demás lo sabemos, pero no lo sentimos. Al salir del retrete, se pierden las sensaciones (valores locales) que se experimentaban en el retrete y se empieza a respirar aire fresco (se obtienen los valores globales del aire), sabiendo al mismo tiempo, como todo el mundo, que hay una patada en los pantalones (resultado de la función de contaminación del aire, que afecta a la vida global de todo el piso)...

Espero haber sido claro

Descubrí la verdad en su obra - ¡gracias! Resulta que declarar una variable dentro de un bloque con el mismo nombre que la variable global lleva a bloquear los datos de la variable global dentro del bloque... Y la advertencia sobre la variable ya declarada no se puede eliminar, ¿verdad?
 
-Aleks-:
Descubrí la verdad en su obra - ¡gracias! Resulta que al declarar una variable dentro de un bloque con el mismo nombre que la variable global se bloquean los datos de la variable global dentro del bloque... y la advertencia sobre la variable ya declarada no se puede eliminar, ¿verdad?
Sí.
 
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;
     }
//---
  }
no lo dice correctamente en la referencia
 
-Aleks-:

Gracias, pero ya he leído el primer enlace, y el segundo confirmó la lógica que utilicé al escribir el código.

Sin embargo, me confunde esta afirmación del segundo enlace "...fuera de este bucle hay otra variable con el mismo nombre... "Pero esta tontería porque si declaras una nueva variable, el valor de la anterior se borrará, entonces no me queda claro, ¿qué sentido tiene usar y almacenar dos variables diferentes (local y global), pero con el mismo valor?

Lamentablemente no está escrito correctamente :(

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:

Por desgracia, está mal escrito allí :(

Bueno, bueno, puedes hacer la salida en letras, porque no puedo reconocer el código muy bien todavía.
 
pako:
no lo dice bien en la ayuda.
¿Por qué me das el código? No sé qué buscar en él... ...y no tengo mucho tiempo. ¿Puedes decirme para qué sirve y qué pasa con la ayuda?
 
Artyom Trishkin:
¿Por qué me das el código? No sé qué buscar en él... ...y estoy limitado por el tiempo. Puedes decirme para qué sirve y cuál es el error en la ayuda.

es el código de la ayuda

es "i" al principio de la función

entonces en el bucle es "i" de nuevo.

 
pako:

es el código de la ayuda

es "i" al principio de la función

entonces en el bucle es "i" de nuevo

Pues no hay error: un bucle con i global (azul), y otro bucle con i local (rojo)

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;
     }
Razón de la queja: