[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 1086

 
drknn:


Che cazzo è questo allora?

bool Fun_New_Bar() // rilevamento Fun_New_Bar fi
{ // ... nuova barra


static datetime New_Time=0; // Ora della barra corrente

Questa è chiamata inizializzazione statica delle variabili. Lo zero sarà assegnato solo quando questa variabile è inizializzata.
 
khorosh:
Questo si chiama inizializzare una variabile statica. Lo zero sarà assegnato solo quando quella variabile è inizializzata.


Oh, cavolo! Fico. Una subroutine è stata chiamata, una variabile statica è stata inizializzata. La subroutine è finita, lasciando le sue variabili nello spazio degli indirizzi della RAM. E, soprattutto, senza liberare lo spazio stesso dagli impegni, giusto?

La vostra inizializzazione statica nella vostra subroutine avverrà ad ogni nuovo tick del NEW!!!! Questo vale per l'inizializzazione di tutte le variabili per tutte le subroutine. Lo scopo e la durata della vostra variabile statica è cosa, eh?

 
drknn:

Oh, cavolo! Fico. Una subroutine è stata chiamata, una variabile statica è stata inizializzata. La subroutine è finita, lasciando le sue variabili nello spazio degli indirizzi della RAM. E, soprattutto, senza liberare lo spazio stesso dagli impegni, giusto?
È facile controllare se funziona correttamente. Perché questa teorizzazione? La pratica è il criterio della verità. Dovresti essere felice se improvvisamente identifichi una lacuna nella tua conoscenza. Sono sempre contento in questi casi e dico grazie a chi mi ha illuminato.
 
drknn:


Oh, cavolo! Fico. Una subroutine è stata chiamata, una variabile statica è stata inizializzata. La subroutine è finita, lasciando le sue variabili nello spazio degli indirizzi della RAM. E, soprattutto, senza liberare lo spazio stesso dagli impegni, giusto?

La vostra inizializzazione statica nella vostra subroutine avverrà ad ogni nuovo tick del NEW!!!! Questo vale per l'inizializzazione di tutte le variabili per tutte le subroutine. Lo scopo e la durata della vostra variabile statica è cosa, eh?


Sì, controlla il tuo grafico M1! Dopo tutto, tutto funziona come dovrebbe, sembra! E non sta suonando ogni tick, ma solo quando si forma un nuovo tick!

int start() // Спец. функция start
{
if(Fun_New_Bar())//проверка наличия нового бара
{
Alert("Сформировался новый бар"); // Вывод на экран
}
return(0); // Выход из start()
}
//--------------------------------------------------------------------
bool Fun_New_Bar() // Ф-ия обнаружения ..
{ // .. нового бара
static datetime New_Time=0; // Время текущего бара
bool New_Bar=false; // Нового бара нет
if(New_Time!=Time[0]) // Сравниваем время
{
New_Time=Time[0]; // Теперь время такое
New_Bar=true; // Поймался новый бар
}
return(New_Bar);
}

 
khorosh:
È facile controllare se funziona. Perché tutta questa teorizzazione? La pratica è il criterio della verità. Dovrebbe essere contento se scopre la sua lacuna di conoscenza. Sono sempre felice in questi casi e ringrazio la persona che mi ha illuminato.


Sono d'accordo. Mi sono un po' eccitato. Le mie scuse. Controllo della statica. Scrivere una sceneggiatura.

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  int SchVizovov=0;
	for(int i=1;i<5;i++){
		SchVizovov=Proverka(i);
	}
  Alert("-------------------");
	return(0);
}
//+------------------------------------------------------------------+
//|                  Пользовательские подпрограммы                   |
//+------------------------------------------------------------------+
int Proverka(int Sch){
	
	static int My_value=0; //
	if(My_value==0){
		My_value=Sch;
		Alert("Статическая переменная инициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
		return(Sch);
	}
	else{
	 My_value=Sch;
	 Alert("Статическая не реинициализирована. Proverka() вызвана ",Sch,"-й раз. Статическая переменная = ",My_value);
	}
	return(Sch);
}

Compilalo e poi buttalo sul grafico. Il risultato è http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Bene. Ahimè, devo ammettere che lo statik non viene reinizializzato. Allora il codice funzionerà. Questo non va bene. :( L'aiuto linguistico dovrebbe spiegare queste sfumature. La guida vi dice solo che una variabile statica non perde il suo valore all'uscita della funzione. Ma non dice che questa variabile non si reinizializzerà quando viene reinizializzata. Accidenti, mi sono imbattuto di nuovo nel fatto che l'aiuto nel meta-editor è incompleto. Cavolo, ho pensato che non mi prenderanno mai più :)))))))

 
drknn:


Sono d'accordo. Mi sono un po' eccitato. Le mie scuse. Controllo della statica. Scrivere una sceneggiatura.

Compilatelo e mettetelo sul grafico. Il risultato è http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Bene. Ahimè, devo ammettere che lo statik non viene reinizializzato. Allora il codice funzionerà. Questo non va bene. :( L'aiuto linguistico dovrebbe spiegare queste sfumature. La guida vi dice solo che una variabile statica non perde il suo valore all'uscita della funzione. Ma non dice che questa variabile non si reinizializzerà quando viene reinizializzata. Oh merda, mi hanno preso di nuovo. Cavolo, pensavo che non mi avrebbero più preso :)))))))

Non ti arrabbiare però, stiamo tutti imparando qui. Succede che qualche sfumatura sfugga alla tua attenzione, e la scopri quando pensavi di sapere tutto.

Il riferimento dice che l'inizializzazione di una variabile statica è una tantum, il che significa che non c'è reinizializzazione in quanto tale.

 
khorosh:
La cosa principale è non arrabbiarsi, stiamo tutti imparando qui. Succede che qualche sfumatura sfugga alla tua attenzione, e la scopri quando pensavi di sapere già tutto.


Non sono arrabbiato per aver scoperto una lacuna nella mia conoscenza - mi arrabbio quando trovo dei difetti nel mio codice, quando ho speso più di un'ora per trovarli, quando si scopre che non era colpa mia, ma un bug nel sistema di aiuto o nel terminale. Se aggiungo il tempo che ho speso durante gli ultimi 6 anni di programmazione per trovare errori relativi a tali questioni, posso dire che una bella fetta della mia vita è semplicemente cestinata. Questo è ciò che è frustrante - il tempo della vita è sprecato in stronzate. Vola via e non torna più. Bene, la situazione di oggi non è stata sconvolgente - al contrario, è stata piacevole - non ho dovuto passare notti a cercare un errore - è stato rapidamente identificato.

Nikolai, ancora una volta le mie scuse - ho pensato per 6 anni che una variabile dichiarata inizializzata con un valore all'interno della funzione, si reinizializza quando questa funzione viene chiamata di nuovo. (Taccio sulle variabili di scorciatoia globale del terminale - quella è un'altra canzone). Si scopre che ci sono eccezioni alla regola. Oggi ho una lezione semplicemente reale!

 
khorosh:

L'aiuto dice che l'inizializzazione di una variabile statica è una tantum, il che significa che non c'è reinizializzazione in quanto tale.

Per citare l'aiuto:

Le variabili statiche sono inizializzate una volta prima di chiamare la funzione specializzata init(),

E dove abbiamo inizializzato una variabile statica? In un sottoprogramma. Abbiamo violato la regola di inizializzazione - l'abbiamo violata.

Prima di chiamare la funzione init(), la variabile statica non è stata dichiarata né chiamata dal sottoprogramma. Questo è ciò che causa confusione. Poiché non c'è stata alcuna inizializzazione della variabile statica prima del blocco init(), la regola della singolarità non sarà valida perché è legata a un particolare frammento della struttura del programma. Questo è ciò che dice il riferimento. Ma non lo soddisfa - la reinizializzazione continua a non avvenire nonostante il fatto che la regola una tantum non sia valida!

Il punto è che la regola dell'una tantum impone una rigidità. È qui che entra in gioco la relazione di equivalenza tra il soggetto e il predicato del giudizio. Quindi è un'equivalenza - uno non esiste senza l'altro.

Ma di nuovo, il linguaggio permette anche un'altra violazione della regola della singolarità. Se dichiariamo questa variabile come dovrebbe essere e se può essere inizializzata con un valore solo prima del blocco di inizializzazione, non possiamo inizializzare questa variabile in nessun altro punto del codice, perché violerebbe la regola della singolarità. Ma lo script che ho fatto mostra che non è così - la variabile può essere inizializzata con un altro valore al volo.

Non ho mai usato queste variabili nel mio codice e non lo farò, dato che tali regole sono violate qui. Non so quali altre insidie ci siano con loro.

 

HO UN PROBLEMA ....

Quando configuro la posta nelle impostazioni del terminale, in SMTP - uso smtp.gmail.com:25

Ottengo l'errore - Mail: 530 5.7.0 Must issue a STARTTLS command first. l3sm2329679fan.0
 
drknn:

Per citare la guida:

Dove abbiamo inizializzato la variabile statica? In una subroutine. Hai infranto la regola dell'inizializzazione - l'hai infranta.

Prima di chiamare la funzione init(), la variabile statica non è stata dichiarata né chiamata dal sottoprogramma. Questo è ciò che causa confusione. Poiché una variabile statica non è stata inizializzata prima del blocco di inizializzazione, la regola della singolarità non è valida perché è legata a un particolare frammento della struttura del programma. Questo è esattamente quello che dice la guida. Ma il diavolo non lo compie - la reinizializzazione continua a non avvenire nonostante il fatto che la regola della singolarità non sia valida!

Inoltre, c'è un esempio di utilizzo di una variabile statica nel tutorial da cui è chiaro che viene inizializzata solo una volta, altrimenti il contatore di tick non funzionerebbe.

//--------------------------------------------------------------------
// staticvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start()                            // Специальная функция start()
  {
   static int Tick;                    // Статическая локальная перем
   Tick++;                             // Счётчик тиков
   Comment("Поступил тик № ",Tick);    // Сообщение, содержащее номер
   return;                             // Оператор выхода из start()
  }
//--------------------------------------------------------------------