Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 497

 

Grazie, ma ho già letto il primo link e il secondo conferma la logica che ho usato quando ho scritto il codice.

Tuttavia, sono confuso da questa affermazione nel secondo link "... C'è un'altra variabile con lo stesso nome fuori da questo ciclo... "Ne consegue che il valore di una variabile globale rimane lo stesso nonostante il fatto che all'interno del blocco verrà dichiarata una nuova variabile con lo stesso nome, ma questo non ha senso perché se si dichiara una nuova variabile, il valore della prima verrà cancellato, quindi non capisco, che senso ha usare e memorizzare due variabili diverse (locale e globale), ma con lo stesso valore?

 
-Aleks-:

Grazie, ma ho già letto il primo link, e il secondo ha confermato la logica che ho usato quando ho scritto il codice.

Tuttavia, sono confuso da questa affermazione del secondo link "...fuori da questo ciclo c'è un'altra variabile con lo stesso nome... "Ma questo non ha senso perché se dichiarate una nuova variabile, il valore di quella precedente sarà cancellato, quindi non mi è chiaro, che senso ha usare e memorizzare due variabili diverse (locale e globale), ma con lo stesso valore?

Secondo me, lei sta scrivendo delle sciocchezze. Se dichiarate una variabile locale all'interno di un ciclo o di una funzione, il valore di una variabile globale con lo stesso nome non sarà influenzato, ma il compilatore vi avvertirà che avete dichiarato una variabile locale con lo stesso nome della variabile globale esistente e lavorando all'interno di una funzione o di un blocco di codice il cui scopo include la variabile appena dichiarata non influenzerà il valore della variabile globale. Vi avverte di questo in modo che capiate che questa è una nuova variabile, e in modo che non vi aspettiate che il valore della variabile globale cambi dopo aver lasciato lo scopo del blocco in cui avete dichiarato una nuova variabile con lo stesso nome della variabile globale esistente.

In termini semplici: tutto ciò che si trova all'interno dell'appartamento vale per tutte le stanze ed è condiviso da tutte le stanze (variabile globale). E tutto ciò che è dentro una stanza - si applica solo alla stanza e non è visibile da altre stanze (è una variabile locale).

Ancora più semplice? Per favore:

Se si incasina l'aria nella toilette (a livello locale), è lì che si incasina. Nel frattempo, tutto l'appartamento (globalmente) sa (come risultato dei tuoi esperimenti sul gabinetto) che è meglio non andare in bagno... Ma l'aria è un concetto per tutto l'appartamento, e tutti i residenti sanno dell'aria viziata nella toilette. Allo stesso tempo, solo la persona fortunata che si trova nella toilette può sperimentare pienamente tutte le delizie del cambiamento dell'ambiente locale all'interno dello spazio limitato (influenza locale del valore della variabile). Il resto di noi lo sa, ma non lo sente. Quando esci dalla toilette, perdi le sensazioni (valori locali) che hai provato nella toilette e cominci a respirare aria fresca (ottieni i valori globali dell'aria), pur sapendo, come tutti, che c'è un calcio nei pantaloni (il risultato della funzione di contaminazione dell'aria, che influisce sulla vita complessiva dell'intero appartamento)...

Spero di essere stato chiaro

 
Artyom Trishkin:

Penso che lei stia scrivendo delle sciocchezze. Se dichiarate una variabile locale all'interno di un ciclo o di una funzione, il valore della variabile globale con lo stesso nome non verrà sovrascritto, ma il compilatore vi avvertirà che avete dichiarato una variabile locale con lo stesso nome della variabile globale esistente, e lavorando all'interno di una funzione o di un blocco di codice il cui scopo include la variabile appena dichiarata non influenzerà il valore della variabile globale. Vi avverte di questo in modo che capiate che questa è una nuova variabile, e in modo che non vi aspettiate che il valore della variabile globale cambi dopo aver lasciato lo scopo del blocco in cui avete dichiarato una nuova variabile con lo stesso nome della variabile globale esistente.

In termini semplici: tutto ciò che si trova all'interno dell'appartamento vale per tutte le stanze ed è condiviso da tutte le stanze (variabile globale). E tutto ciò che è dentro una stanza - si applica solo alla stanza e non è visibile da altre stanze (è una variabile locale).

Ancora più semplice? Per favore:

Se si incasina l'aria nella toilette (a livello locale), è lì che si incasina. Nel frattempo, tutto l'appartamento (globalmente) sa (come risultato dei tuoi esperimenti sul gabinetto) che è meglio non andare in bagno... Ma l'aria è un concetto per tutto l'appartamento, e tutti gli occupanti sanno dell'aria viziata nella toilette. Allo stesso tempo, solo la persona fortunata che si trova nella toilette può sperimentare pienamente tutte le delizie del cambiamento dell'ambiente locale all'interno dello spazio limitato (influenza locale del valore della variabile). Il resto di noi lo sa, ma non lo sente. Quando esci dalla toilette, perdi le sensazioni (valori locali) che hai provato nella toilette e cominci a respirare aria fresca (ottieni i valori globali dell'aria), pur sapendo, come tutti, che c'è un calcio nei pantaloni (il risultato della funzione di contaminazione dell'aria, che influisce sulla vita complessiva dell'intero appartamento)...

Spero di essere stato chiaro

Ho scoperto la verità nella tua opera - grazie! Si scopre che dichiarando una variabile all'interno di un blocco con lo stesso nome della variabile globale si bloccano i dati della variabile globale all'interno del blocco... E l'avvertimento sulla variabile già dichiarata non può essere rimosso, giusto?
 
-Aleks-:
Ho scoperto la verità nella tua opera - grazie! Si scopre che dichiarando una variabile all'interno di un blocco con lo stesso nome della variabile globale si bloccano i dati della variabile globale all'interno del blocco... e l'avvertimento sulla variabile già dichiarata non può essere rimosso, giusto?
Giusto.
 
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;
     }
//---
  }
non lo dice correttamente nel riferimento
 
-Aleks-:

Grazie, ma ho già letto il primo link, e il secondo ha confermato la logica che ho usato quando ho scritto il codice.

Tuttavia, sono confuso da questa affermazione del secondo link "...fuori da questo ciclo c'è un'altra variabile con lo stesso nome... "Ma questa assurdità perché se si dichiara una nuova variabile, il valore della prima sarà cancellato, quindi non mi è chiaro, che senso ha usare e memorizzare due variabili diverse (locale e globale), ma con lo stesso valore?

Purtroppo non è scritto correttamente :(

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:

Sfortunatamente, è scritto male lì :(

Bene, bene, puoi fare l'uscita in lettere, perché non riesco ancora a riconoscere bene il codice.
 
pako:
Non lo dice bene nell'aiuto.
Perché mi dai il codice? Non so cosa cercare in esso... ...e non ho molto tempo. Puoi dirmi a cosa serve e cosa c'è di sbagliato nell'aiuto?
 
Artyom Trishkin:
Perché mi dai il codice? Non so cosa cercare in esso... ...e sono limitato dal tempo. Potete dirmi a cosa serve e qual è l'errore nell'aiuto.

è il codice dell'aiuto

è "i" all'inizio della funzione

poi nel ciclo è di nuovo "i".

 
pako:

è il codice dell'aiuto

è "i" all'inizio della funzione

poi nel ciclo è di nuovo "i"

Bene, non c'è nessun errore: un ciclo con i globale (blu), e un altro ciclo con i locale (rosso)

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