Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 497

 

Obrigado, mas já li a primeira ligação antes e a segunda confirma a lógica que utilizei ao escrever o código.

No entanto, estou confuso com esta afirmação no segundo link "... Háoutra variável com o mesmo nome fora deste laço... "Segue-se que o valor de uma variável global permanece o mesmo apesar de dentro do bloco ser declarada uma nova variável com o mesmo nome, mas este disparate porque se declarar uma nova variável, o valor da primeira será apagado, então não compreendo, de que serve usar e armazenar duas variáveis diferentes (local e global), mas com o mesmo valor?

 
-Aleks-:

Obrigado, mas já li a primeira ligação antes, e a segunda confirmou a lógica que utilizei ao escrever o código.

No entanto, estou confuso com esta afirmação a partir do segundo link "...fora deste laço há outra variável com o mesmo nome. "Mas isto é um disparate porque se declarar uma nova variável, o valor da primeira será apagado, então não compreendo, de que serve usar e armazenar duas variáveis diferentes (local e global), mas com o mesmo valor?

Na minha opinião, está a escrever disparates. Se declarar uma variável local dentro de um laço ou função, o valor de uma variável global com o mesmo nome não será afectado, mas o compilador avisá-lo-á que declarou uma variável local com o mesmo nome que a variável global existente e que trabalha dentro de uma função ou bloco de código cujo âmbito inclui a variável recentemente declarada não afectará o valor da variável global. Avisa-o sobre isto para que compreenda que se trata de uma nova variável, e para que não espere que o valor da variável global mude depois de deixar o âmbito do bloco no qual declarou uma nova variável com o mesmo nome que a variável global existente.

Em termos simples: tudo dentro do apartamento aplica-se a todos os quartos e é partilhado por todos os quartos (variável global). E tudo o que está dentro de uma sala - aplica-se apenas à sala e não é visível de outras salas (é uma variável local).

Ainda mais simples? Por favor:

Se estragar o ar na casa de banho (localmente), é aí que se faz a confusão. Entretanto, todo o apartamento (globalmente) sabe (como resultado das suas experiências na casa de banho) que é melhor não ir à casa de banho... Mas o ar é um conceito para todo o apartamento, e todos os residentes sabem sobre o ar estragado na casa de banho. Ao mesmo tempo, só a pessoa sortuda que está na casa de banho pode experimentar todas as delícias de mudar o ambiente local dentro do espaço confinado (influência local do valor da variável). O resto de nós sabemos disso, mas não o sentimos. Quando se sai da sanita, perde-se as sensações (valores locais) que se experimenta na sanita e começa-se a respirar ar fresco (obter os valores globais do ar), sabendo, como todos os outros, que há um pontapé nas calças (o resultado da função de contaminação do ar, que afecta a vida global de todo o apartamento)...

Espero ter-me feito entender

 
Artyom Trishkin:

Penso que estás a escrever disparates. Se declarar uma variável local dentro de um laço ou função, o valor da variável global com o mesmo nome não será sobrescrito, mas o compilador avisá-lo-á que declarou uma variável local com o mesmo nome que a variável global existente, e trabalhando dentro de uma função ou bloco de código cujo âmbito inclui a variável recentemente declarada, não afectará o valor da variável global. Avisa-o sobre isto para que compreenda que se trata de uma nova variável, e para que não espere que o valor da variável global mude depois de deixar o âmbito do bloco no qual declarou uma nova variável com o mesmo nome que a variável global existente.

Em termos simples: tudo dentro do apartamento aplica-se a todos os quartos e é partilhado por todos os quartos (variável global). E tudo o que está dentro de uma sala - aplica-se apenas à sala e não é visível de outras salas (é uma variável local).

Ainda mais simples? Por favor:

Se estragar o ar na casa de banho (localmente), é aí que se faz a confusão. Entretanto, todo o apartamento (globalmente) sabe (o resultado das suas experiências na casa de banho) que é melhor não ir à casa de banho... Mas o ar é um conceito para todo o apartamento, e todos os ocupantes sabem sobre o ar estragado na sanita. Ao mesmo tempo, só a pessoa sortuda que está na casa de banho pode experimentar todas as delícias de mudar o ambiente local dentro do espaço confinado (influência local do valor da variável). O resto de nós sabemos disso, mas não o sentimos. Quando se sai da sanita, perde-se as sensações (valores locais) que se experimenta na sanita e começa-se a respirar ar fresco (obter os valores globais do ar), sabendo, como todos os outros, que há um pontapé nas calças (o resultado da função de contaminação do ar, que afecta a vida global de todo o apartamento)...

Espero ter-me feito entender

Descobriu a verdade na sua obra - obrigado! Acontece que declarar uma variável dentro de um bloco com o mesmo nome que a variável global leva ao bloqueio de dados da variável global dentro do bloco... E o aviso sobre a variável já declarada não pode ser removido, certo?
 
-Aleks-:
Descobriu a verdade na sua obra - obrigado! Acontece que declarar uma variável dentro de um bloco com o mesmo nome que a variável global resulta no bloqueio de dados da variável global dentro do bloco... e o aviso sobre a variável já declarada não pode ser removido, certo?
Certo.
 
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;
     }
//---
  }
não o diz correctamente na referência
 
-Aleks-:

Obrigado, mas já li a primeira ligação antes, e a segunda confirmou a lógica que utilizei ao escrever o código.

No entanto, estou confuso com esta afirmação a partir do segundo link "...fora deste laço há outra variável com o mesmo nome. "Mas este disparate porque se declarar uma nova variável, o valor da primeira será apagado, então não está claro para mim, de que serve usar e armazenar duas variáveis diferentes (local e global), mas com o mesmo valor?

Infelizmente não 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:

Infelizmente, está mal escrito aí :(

Bem, bem, podem fazer a saída em letras, porque eu não consigo reconhecer o código neste momento.
 
pako:
não o diz correctamente na ajuda.
Porque me está a dar o código? Não sei o que procurar nele... ...e não tenho muito tempo. Pode dizer-me para que serve e o que está errado com a ajuda?
 
Artyom Trishkin:
Porque me está a dar o código? Não sei o que procurar nele... ...e estou limitado pelo tempo. Pode dizer-me para que serve e qual é o erro na ajuda.

é o código da ajuda

é "i" no início da função

depois no loop é novamente "i".

 
pako:

é o código da ajuda

é "i" no início da função

então no laço está "i" novamente

Bem, não há erro: um laço com i global (azul), e outro laço com i local (vermelho)

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ão: