[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 1086

 
drknn:


Was zum Teufel ist das denn?

bool Fun_New_Bar() // Fun_New_Bar-Erkennung fi
{ // ... neuer Balken


static datetime New_Time=0; // Zeitpunkt des aktuellen Taktes

Dies wird als statische Initialisierung von Variablen bezeichnet. Null wird nur zugewiesen, wenn diese Variable initialisiert wird.
 
khorosh:
Dies wird als Initialisierung einer statischen Variablen bezeichnet. Null wird nur zugewiesen, wenn die Variable initialisiert wird.


Oh, Mann! Cool. Ein Unterprogramm wurde aufgerufen, eine statische Variable wurde initialisiert. Das Unterprogramm wurde beendet und seine Variablen im RAM-Adressraum belassen. Und vor allem, ohne den Raum selbst von der Betriebsamkeit zu befreien, oder?

Die statische Initialisierung in Ihrem Unterprogramm erfolgt bei jedem neuen Tick des NEW!!!! Dies gilt für die Initialisierung aller Variablen für alle Unterprogramme. Der Geltungsbereich und die Lebensdauer Ihrer statischen Variablen ist was, hm?

 
drknn:

Oh, Mann! Cool. Ein Unterprogramm wurde aufgerufen, eine statische Variable wurde initialisiert. Das Unterprogramm wurde beendet und seine Variablen im RAM-Adressraum belassen. Und vor allem, ohne den Raum selbst von der Betriebsamkeit zu befreien, oder?
Es ist einfach zu überprüfen, ob es richtig funktioniert. Warum diese Theorien? Die Praxis ist das Kriterium der Wahrheit. Sie sollten sich freuen, wenn Sie plötzlich eine Wissenslücke entdecken. In solchen Fällen bin ich immer froh und bedanke mich bei demjenigen, der mich aufgeklärt hat.
 
drknn:


Oh, Mann! Cool. Ein Unterprogramm wurde aufgerufen, eine statische Variable wurde initialisiert. Das Unterprogramm wurde beendet und seine Variablen im RAM-Adressraum belassen. Und vor allem, ohne den Raum selbst von der Betriebsamkeit zu befreien, oder?

Ihre statische Initialisierung in Ihrem Unterprogramm erfolgt bei jedem neuen Tick des NEW!!!! Dies gilt für die Initialisierung aller Variablen für alle Unterprogramme. Der Geltungsbereich und die Lebensdauer Ihrer statischen Variablen ist was, hm?


Ja, sehen Sie sich Ihr M1-Diagramm an! Schließlich funktioniert alles so, wie es sollte, so scheint es! Und es piept nicht bei jeder Zecke, sondern nur, wenn sich eine neue Zecke bildet!

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:
Es ist einfach zu überprüfen, ob es funktioniert. Warum all diese Theorien? Die Praxis ist das Kriterium der Wahrheit. Sie sollten sich freuen, wenn Sie Ihre Wissenslücke entdecken. In solchen Fällen bin ich immer froh und bedanke mich bei der Person, die mich aufgeklärt hat.


Ich stimme zu. Ich war ein wenig aufgeregt. Ich bitte um Entschuldigung. Überprüfung der Statik. Schreiben Sie ein Drehbuch.

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

Stellen Sie sie zusammen und tragen Sie sie in die Tabelle ein. Das Ergebnis ist http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Nun. Leider muss ich zugeben, dass die Statik nicht reinitialisiert ist. Dann wird der Code funktionieren. Das ist nicht gut. :( Die Sprachhilfe sollte solche Nuancen erklären. Die Hilfe sagt Ihnen nur, dass eine statische Variable ihren Wert beim Verlassen der Funktion nicht verliert. Es wird aber nicht gesagt, dass diese Variable nicht neu initialisiert wird, wenn sie neu initialisiert wird. Oje, ich bin schon wieder auf die Tatsache gestoßen, dass die Hilfe im Meta-Editor unvollständig ist. Oh je, ich dachte, ich werde nie wieder erwischt :)))))))

 
drknn:


Ich stimme zu. Ich war ein wenig aufgeregt. Ich bitte um Entschuldigung. Überprüfung der Statik. Schreiben Sie ein Drehbuch.

Kompilieren Sie es, und werfen Sie es dann in die Tabelle. Das Ergebnis ist http://s2.ipicture.ru/uploads/20101229/k2u2OUqX.jpg.

Nun. Leider muss ich zugeben, dass die Statik nicht reinitialisiert ist. Dann wird der Code funktionieren. Das ist nicht gut. :( Die Sprachhilfe sollte solche Nuancen erklären. Die Hilfe sagt Ihnen nur, dass eine statische Variable ihren Wert beim Verlassen der Funktion nicht verliert. Es wird aber nicht gesagt, dass diese Variable nicht neu initialisiert wird, wenn sie neu initialisiert wird. Oh Mist, ich bin schon wieder erwischt worden. Mensch, ich dachte, ich würde nie wieder erwischt werden :)))))))

Aber reg dich nicht auf, wir lernen hier alle noch dazu. Es kann vorkommen, dass Ihnen eine Nuance entgeht und Sie sie erst entdecken, als Sie schon alles zu wissen glaubten.

Der Verweis besagt, dass die Initialisierung einer statischen Variablen einmalig ist, was bedeutet, dass es keine Reinitialisierung als solche gibt.

 
khorosh:
Das Wichtigste ist, sich nicht aufzuregen, wir lernen hier alle. Es kann passieren, dass einem eine Nuance entgeht und man sie erst entdeckt, als man schon alles zu wissen glaubte.


Ich rege mich nicht darüber auf, dass ich eine Wissenslücke entdeckt habe - ich rege mich auf, wenn ich Fehler in meinem Code finde, wenn ich mehr als eine Stunde damit verbracht habe, sie zu finden, wenn sich herausstellt, dass es nicht mein Fehler war, sondern ein Fehler im Hilfesystem oder im Terminal. Wenn ich die Zeit zusammenzähle, die ich in den letzten 6 Jahren mit dem Programmieren verbracht habe, um Fehler im Zusammenhang mit solchen Problemen zu finden, kann ich sagen, dass ein ziemlich großer Teil meines Lebens einfach weg ist. Das ist es, was frustrierend ist - Lebenszeit wird mit Blödsinn vergeudet. Er fliegt weg und kommt nie mehr zurück. Nun, die heutige Situation war nicht beunruhigend - im Gegenteil, sie war erfreulich - ich musste nicht nächtelang nach einem Fehler suchen - er war schnell gefunden.

Nikolai, noch einmal meine Entschuldigung - ich habe 6 Jahre lang gedacht, dass eine Variable, die innerhalb einer Funktion mit einem Wert initialisiert wurde, neu initialisiert wird, wenn diese Funktion erneut aufgerufen wird. (Ich schweige über Variablen der globalen Abkürzung des Terminals - das ist ein anderes Lied). Wie sich herausstellte, gibt es Ausnahmen von der Regel. Ich habe heute eine einfach königliche Lektion!

 
khorosh:

In der Hilfe heißt es, dass die Initialisierung einer statischen Variablen einmalig ist, was bedeutet, dass es keine Reinitialisierung gibt.

Um die Hilfe zu zitieren:

Statische Variablen werden einmal initialisiert, bevor die spezialisierte Funktion init() aufgerufen wird,

Und wo haben wir eine statische Variable initialisiert? In einem Unterprogramm. Wir haben die Initialisierungsregel gebrochen - wir haben sie gebrochen.

Vor dem Aufruf der Funktion init() wurde die statische Variable weder deklariert noch aus dem Unterprogramm aufgerufen. Das ist es, was Verwirrung stiftet. Da die statische Variable vor dem init()-Block nicht initialisiert wurde, ist die Singularitätsregel ungültig, da sie an ein bestimmtes Fragment der Programmstruktur gebunden ist. Dies wird im Hilfetext beschrieben. Aber er erfüllt sie nicht - die Reinitialisierung findet immer noch nicht statt, obwohl die einmalige Regel ungültig ist!

Der Punkt ist, dass die einmalige Regelung eine Starrheit auferlegt. Hier kommt die Beziehung der Äquivalenz zwischen dem Subjekt und dem Prädikat des Urteils ins Spiel. Es handelt sich also um eine Gleichwertigkeit - das eine gibt es nicht ohne das andere.

Andererseits erlaubt die Sprache auch einen weiteren Verstoß gegen die Singularitätsregel. Wenn wir diese Variable so deklarieren, wie sie sein sollte, und wenn sie nur vor dem Initialisierungsblock mit einem Wert initialisiert werden kann, können wir diese Variable nirgendwo anders im Code initialisieren, da dies die Singularitätsregel verletzen würde. Aber das Skript, das ich erstellt habe, zeigt, dass das nicht so ist - die Variable kann spontan mit einem anderen Wert initialisiert werden.

Ich habe diese Variablen nie in meinem Code verwendet und werde dies auch nicht tun, da es sich um eine Verletzung der Regeln handelt. Ich weiß nicht, welche anderen Fallstricke es bei ihnen gibt.

 

ICH HABE EIN PROBLEM ....

Wenn ich in den Terminaleinstellungen Mail einrichte, verwende ich unter SMTP smtp.gmail.com:25

Ich erhalte die Fehlermeldung - Mail: 530 5.7.0 Muss zuerst einen STARTTLS-Befehl eingeben. l3sm2329679fan.0
 
drknn:

Um aus der Hilfe zu zitieren:

Wo haben wir die statische Variable initialisiert? In einer Unterroutine. Sie haben gegen die Initialisierungsregel verstoßen - Sie haben sie verletzt.

Vor dem Aufruf der Funktion init() wurde die statische Variable weder deklariert noch aus dem Unterprogramm aufgerufen. Das ist es, was Verwirrung stiftet. Da eine statische Variable nicht vor dem Initialisierungsblock initialisiert wurde, ist die Singularitätsregel ungültig, da sie an ein bestimmtes Fragment der Programmstruktur gebunden ist. Das ist genau das, was in der Hilfe steht. Aber der Teufel erfüllt sie nicht - die Reinitialisierung findet immer noch nicht statt, obwohl die Singularitätsregel ungültig ist!

Es gibt auch ein Beispiel für die Verwendung einer statischen Variable im Tutorial, aus dem hervorgeht, dass sie nur einmal initialisiert wird, da sonst der Tick-Zähler nicht funktionieren würde.

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