[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 1086

 
drknn:


Que porra é esta, então?

bool Fun_New_Bar() // Fun_New_Bar detection fi
{ // ... novo bar


data/hora estática New_Time=0; // Hora da barra atual

Isto é chamado de inicialização estática de variáveis. Zero só será atribuído quando esta variável for rubricada.
 
khorosh:
Isto é chamado de inicialização de uma variável estática. Zero só será atribuído quando essa variável for inicializada.


Oh, cara! Legal. Um subprograma foi chamado, uma variável estática foi inicializada. A sub-rotina terminou, deixando suas variáveis no espaço de endereços RAM. E o mais importante, sem liberar o espaço em si, certo?

Sua inicialização estática em sua sub-rotina acontecerá a cada novo tick da NEW!!!! Isto se aplica à inicialização de todas as variáveis para todas as sub-rotinas. O escopo e a vida útil de sua variável estática é o que, Huh?

 
drknn:

Oh, cara! Legal. Uma sub-rotina foi chamada, uma variável estática foi inicializada. A sub-rotina terminou, deixando suas variáveis no espaço de endereços RAM. E o mais importante, sem liberar o espaço em si, certo?
É fácil verificar se está funcionando corretamente. Por que esta teorização? A prática é o critério da verdade. Você deve ficar feliz se de repente identificar uma lacuna em seus conhecimentos. Fico sempre satisfeito nestes casos e agradeço àquele que me iluminou.
 
drknn:


Oh, cara! Legal. Uma sub-rotina foi chamada, uma variável estática foi inicializada. A sub-rotina terminou, deixando suas variáveis no espaço de endereços RAM. E o mais importante, sem liberar o espaço em si, certo?

Sua inicialização estática em sua sub-rotina acontecerá a cada novo tick da NEW!!!! Isto se aplica à inicialização de todas as variáveis para todas as sub-rotinas. O escopo e a vida útil de sua variável estática é o que, Huh?


Sim, verifique no seu gráfico M1! Afinal de contas, tudo funciona como deveria, ao que parece! E não está apitando a cada tique, mas somente quando um novo tique é formado!

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:
É fácil verificar se funciona. Por que toda essa teorização? A prática é o critério da verdade. Você deve ficar satisfeito se souber de sua lacuna de conhecimento. Estou sempre satisfeito em tais casos e agradeço à pessoa que me iluminou.


Eu concordo. Fiquei um pouco excitado. Minhas desculpas. Verificação da estática. Escreva um roteiro.

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
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);
}

Compilá-la e depois atirá-la na tabela. O resultado é http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Bem. Infelizmente, tenho que admitir que o statik não é reinicializado. Então o código funcionará. Isto não é bom. (A ajuda lingüística deve explicar tais nuances. A ajuda diz apenas que uma variável estática não perde seu valor na saída da função. Mas não diz que esta variável não será reinicializada ao ser reinicializada. Caramba, eu descobri que a ajuda no meta-editor está incompleta novamente. Nossa, eu pensei que nunca mais seria pego :)))))))

 
drknn:


Eu concordo. Fiquei um pouco excitado. Minhas desculpas. Verificação da estática. Escreva um roteiro.

Compilá-la e depois atirá-la na tabela. O resultado é http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Bem. Infelizmente, tenho que admitir que o statik não é reinicializado. Então o código funcionará. Isto não é bom. (A ajuda lingüística deve explicar tais nuances. A ajuda diz apenas que uma variável estática não perde seu valor na saída da função. Mas não diz que esta variável não será reinicializada ao ser reinicializada. Oh merda, fui pego de novo. Nossa, eu pensei que nunca mais seria pego :)))))))

Mas não fique chateado, estamos todos aprendendo aqui. Acontece que algumas nuances escapam de sua atenção, e você descobre quando pensava que sabia tudo.

A referência diz que a inicialização de uma variável estática é única, o que significa que não há reinicialização como tal.

 
khorosh:
O principal é não ficar chateado, estamos todos aprendendo aqui. Acontece que algumas nuances escapam de sua atenção, e você descobre quando pensava que já sabia tudo.


Não fico chateado por ter descoberto uma falha em meu conhecimento - fico chateado quando encontro falhas em meu código, quando passo mais de uma hora para encontrá-las, quando acontece que a culpa não foi minha, mas um bug no sistema de ajuda ou no terminal. Se somarmos o tempo que passei durante os últimos 6 anos de programação para encontrar erros relacionados a tais questões, posso dizer que uma grande parte da minha vida está simplesmente destruída. Isso é o que é frustrante - o tempo da vida é desperdiçado em besteiras. Voa para longe e nunca mais volta. Bem, a situação de hoje não foi perturbadora - pelo contrário, foi agradável - não tive que passar noites procurando por um erro - foi rapidamente identificada.

Nikolai, mais uma vez minhas desculpas - há 6 anos eu pensei que uma variável declarada inicializada com um valor dentro da função, reinicia quando esta função é chamada novamente. (Não falo sobre as variáveis do atalho global do terminal - essa é outra canção). Acontece que existem exceções à regra. Hoje eu tenho uma simples lição real!

 
khorosh:

A ajuda diz que a inicialização de uma variável estática é única, o que significa que não há reinicialização como tal.

Para citar a ajuda:

As variáveis estáticas são inicializadas uma vez antes de chamar a função init() especializada,

E onde inicializamos uma variável estática? Em um sub-programa. Quebramos a regra da iniciação - quebramos ela.

Antes de chamar a função init(), a variável estática não foi declarada nem chamada do sub-programa. Isto é o que causa confusão. Como não houve inicialização da variável estática antes do bloco init(), a regra da singularidade será inválida porque está ligada a um fragmento particular da estrutura do programa. Isto é o que diz o texto de ajuda. Mas não a cumpre - a reinicialização ainda não ocorre, apesar de a regra de uma única vez ser inválida!

A questão é que a regra de uma única vez impõe uma rigidez. É aqui que entra em jogo a relação de equivalência entre o sujeito e o predicado do julgamento. Portanto, é equivalência - uma não existe sem a outra.

Mas, novamente, a linguagem também permite outra violação da regra da singularidade. Se declararmos esta variável como deveria ser e se ela puder ser inicializada com um valor apenas antes do bloco de inicialização, não poderemos inicializar esta variável em nenhum outro lugar do código, pois ela violaria a regra da singularidade. Mas o roteiro que fiz mostra que não é assim - a variável pode ser inicializada com outro valor na mosca.

Eu nunca usei estas variáveis em meu código e não o farei, uma vez que tais regras são violadas aqui. Eu não sei que outras armadilhas existem com eles.

 

TENHO UM PROBLEMA ....

Quando configuro o correio nas configurações do terminal, em SMTP - uso smtp.gmail.com:25

Eu recebo o erro - Correio: 530 5.7.0 Deve emitir um comando STARTTLS primeiro. l3sm2329679fan.0
 
drknn:

Para citar a ajuda:

Onde inicializamos a variável estática? Em uma sub-rotina. Você quebrou a regra da inicialização - você a quebrou.

Antes de chamar a função init(), a variável estática não foi declarada nem chamada do sub-programa. Isto é o que causa confusão. Como uma variável estática não foi inicializada antes do bloco de inicialização, a regra da singularidade é inválida porque está ligada a um fragmento particular da estrutura do programa. Isto é exatamente o que a ajuda diz sobre o assunto. Mas o diabo não o cumpre - a reinicialização ainda não ocorre, apesar de a regra da singularidade ser inválida!

Além disso, há um exemplo de utilização de uma variável estática no tutorial a partir da qual fica claro que ela é inicializada apenas uma vez, caso contrário o contador de carrapatos não funcionaria.

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