[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 1086

 
drknn:


C'est quoi ce bordel alors ?

bool Fun_New_Bar() // Détection de Fun_New_Bar fi
{ // ... nouvelle barre


static datetime New_Time=0 ; // Heure de la barre actuelle

C'est ce qu'on appelle l'initialisation statique des variables. Le zéro ne sera attribué que lorsque cette variable sera initialisée.
 
khorosh:
Cela s'appelle initialiser une variable statique. Le zéro ne sera attribué que lorsque cette variable sera initialisée.


Oh, mec ! Cool. Une sous-routine a été appelée, une variable statique a été initialisée. Le sous-routine se termine, laissant ses variables dans l'espace d'adressage de la RAM. Et surtout, sans libérer l'espace lui-même de l'agitation, n'est-ce pas ?

Votre initialisation statique dans votre sous-programme se produira à chaque nouveau tick du NEW !!!!. Cela s'applique à l'initialisation de toutes les variables de toutes les sous-routines. La portée et la durée de vie de votre variable statique est quoi, hein ?

 
drknn:

Oh, mec ! Cool. Une sous-routine a été appelée, une variable statique a été initialisée. Le sous-routine se termine, laissant ses variables dans l'espace d'adressage de la RAM. Et surtout, sans libérer l'espace lui-même de l'agitation, n'est-ce pas ?
Il est facile de vérifier s'il fonctionne correctement. Pourquoi cette théorisation ? La pratique est le critère de la vérité. Vous devriez être heureux si vous identifiez soudainement une lacune dans vos connaissances. Je suis toujours content dans ces cas-là et je dis merci à celui qui m'a éclairé.
 
drknn:


Oh, mec ! Cool. Une sous-routine a été appelée, une variable statique a été initialisée. Le sous-routine se termine, laissant ses variables dans l'espace d'adressage de la RAM. Et surtout, sans libérer l'espace lui-même de l'agitation, n'est-ce pas ?

L'initialisation statique de votre sous-programme se produira à chaque nouveau tick du NEW !!!!. Cela s'applique à l'initialisation de toutes les variables de toutes les sous-routines. La portée et la durée de vie de votre variable statique est quoi, hein ?


Oui, vérifiez votre graphique M1 ! Après tout, tout fonctionne comme il se doit, semble-t-il ! Et il n'émet pas de bip à chaque tic, mais seulement lorsqu'un nouveau tic se forme !

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:
Il est facile de vérifier s'il fonctionne. Pourquoi toutes ces théories ? La pratique est le critère de la vérité. Vous devriez être heureux si vous découvrez votre manque de connaissances. Je suis toujours heureux dans ces cas-là et je dis merci à la personne qui m'a éclairé.


Je suis d'accord. J'étais un peu excité. Mes excuses. Vérification de la statique. Écrire un scénario.

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

Compilez-la, puis jetez-la sur le tableau. Le résultat est http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Bien. Hélas, je dois constater que la statik n'est pas réinitialisée. Alors le code fonctionnera. Ce n'est pas bon. :( L'aide linguistique devrait expliquer ces nuances. L'aide vous indique seulement qu'une variable statique ne perd pas sa valeur à la sortie de la fonction. Mais il n'est pas dit que cette variable ne se réinitialisera pas lorsqu'elle sera réinitialisée. Bon sang, je me suis encore rendu compte que l'aide dans le méta-éditeur est incomplète. Bon sang, je pensais que je ne me ferais plus jamais prendre :)))))))

 
drknn:


Je suis d'accord. J'étais un peu excité. Mes excuses. Vérification de la statique. Écrire un scénario.

Compilez-les, mettez-les sur le tableau. Le résultat est http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Bien. Hélas, je dois constater que la statik n'est pas réinitialisée. Alors le code fonctionnera. Ce n'est pas bon. :( L'aide linguistique devrait expliquer ces nuances. L'aide vous indique seulement qu'une variable statique ne perd pas sa valeur à la sortie de la fonction. Mais il n'est pas dit que cette variable ne se réinitialisera pas lorsqu'elle sera réinitialisée. Oh merde, je suis encore pris. Bon sang, je pensais que je ne me ferais plus jamais prendre :)))))))

Ne vous énervez pas pour autant, nous apprenons tous ici. Il arrive qu'une nuance vous échappe et que vous la découvriez alors que vous pensiez tout savoir.

La référence indique que l'initialisation d'une variable statique est unique, ce qui signifie qu'il n'y a pas de réinitialisation en tant que telle.

 
khorosh:
L'essentiel est de ne pas s'énerver, nous apprenons tous ici. Il arrive qu'une nuance vous échappe et que vous la découvriez alors que vous pensiez déjà tout savoir.


Je ne suis pas contrarié d'avoir découvert une lacune dans mes connaissances - je suis contrarié lorsque je trouve des failles dans mon code, lorsque j'ai passé plus d'une heure à les trouver, lorsqu'il s'avère que ce n'était pas ma faute, mais un bug dans le système d'aide ou dans le terminal. Si l'on additionne le temps que j'ai passé pendant les 6 dernières années de programmation à trouver des erreurs liées à de tels problèmes, je peux dire qu'une grande partie de ma vie est tout simplement fichue. C'est ce qui est frustrant - le temps de la vie est gaspillé pour des conneries. Il s'envole et ne revient jamais. Eh bien, la situation d'aujourd'hui n'a pas été bouleversante - au contraire, elle a été réjouissante - je n'ai pas eu à passer des nuits à chercher une erreur - elle a été rapidement identifiée.

Nikolaï, encore une fois mes excuses - j'ai pensé pendant 6 ans qu'une variable déclarée initialisée avec une valeur à l'intérieur d'une fonction, se réinitialise lorsque cette fonction est appelée à nouveau. (Je passe sous silence les variables du raccourci global du terminal - c'est une autre chanson). Il s'avère qu'il y a des exceptions à la règle. J'ai une leçon tout simplement royale aujourd'hui !

 
khorosh:

L'aide indique que l'initialisation d'une variable statique est unique, ce qui signifie qu'il n'y a pas de réinitialisation en tant que telle.

Pour citer l'aide :

Les variables statiques sont initialisées une fois avant d'appeler la fonction spécialisée init(),

Et où avons-nous initialisé une variable statique ? Dans un sous-programme. Nous avons violé la règle d'initialisation - nous l'avons violée.

Avant d'appeler la fonction init(), la variable statique n'a été ni déclarée ni appelée depuis le sous-programme. C'est ce qui crée la confusion. Comme il n'y a pas eu d'initialisation de la variable statique avant le bloc init(), la règle de singularité sera invalide car elle est liée à un fragment particulier de la structure du programme. Voici ce que dit la référence à ce sujet. Mais elle ne l'accomplit pas - la réinitialisation ne se produit toujours pas malgré le fait que la règle unique est invalide !

Le fait est que la règle unique impose une rigidité. C'est là que la relation d'équivalence entre le sujet et le prédicat du jugement entre en jeu. Il s'agit donc d'une équivalence - l'un n'existe pas sans l'autre.

Mais là encore, le langage permet une autre violation de la règle de la singularité. Si nous déclarons cette variable comme il se doit et si elle ne peut être initialisée avec une valeur qu'avant le bloc d'initialisation, nous ne pouvons initialiser cette variable nulle part ailleurs dans le code, car cela violerait la règle de singularité. Mais le script que j'ai réalisé montre que ce n'est pas le cas - la variable peut être initialisée avec une autre valeur à la volée.

Je n'ai jamais utilisé ces variables dans mon code et ne le ferai pas puisque ces règles sont violées ici. Je ne sais pas quels sont les autres pièges qu'ils présentent.

 

J'AI UN PROBLÈME ....

Lorsque je configure le courrier dans les paramètres du terminal, dans SMTP - j'utilise smtp.gmail.com:25

J'obtiens l'erreur - Mail : 530 5.7.0 Must issue a STARTTLS command first. l3sm2329679fan.0
 
drknn:

Pour citer l'aide :

Où avons-nous initialisé la variable statique ? Dans une sous-routine. Vous avez enfreint la règle d'initialisation - vous l'avez enfreinte.

Avant d'appeler la fonction init(), la variable statique n'a été ni déclarée ni appelée depuis le sous-programme. C'est ce qui crée la confusion. Puisqu'une variable statique n'a pas été initialisée avant le bloc d'initialisation, la règle de singularité est invalide car elle est liée à un fragment particulier de la structure du programme. C'est exactement ce que l'aide dit à ce sujet. Mais le diable ne l'accomplit pas - la réinitialisation ne se produit toujours pas malgré le fait que la règle de singularité est invalide !

En outre, le didacticiel contient un exemple d'utilisation d'une variable statique qui montre clairement qu'elle n'est initialisée qu'une seule fois, sinon le compteur de tics ne fonctionnerait pas.

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