Fehler, Irrtümer, Fragen - Seite 2724

 
Slava :

Nein. FileFlush muss durchgeführt werden, wenn Sie möchten, dass jemand anderes die geänderte Datei lesen kann.

Das Problem ist, dass das MQL5-Programm die Datei beim Öffnen in seinen eigenen Puffer liest. Und es weiß nicht, dass sich etwas in der Datei geändert hat, bis es die Datei erneut liest. Die Datei kann nur wieder gelesen werden, wenn sie geschlossen und dann geöffnet wird.

Glory, genau das ist das Problem. Bitte schauen Sie sich den Link an, den ich oben gepostet habe, dort finden Sie den Code, um das Problem zu reproduzieren.

Dieselbe Datei wird von demselben EA geöffnet, 1 Deskriptor zum Schreiben, 2 zum Lesen, fileflush wird nach dem Schreiben verwendet, versuchen Sie zu lesen, und es funktioniert nicht richtig.

Natürlich funktioniert es auch, wenn Sie das Programm schließen/öffnen, aber dann brauchen Sie FileFlush nicht zu verwenden.

 
Alain Verleyen:

Glory, genau das ist das Problem. Bitte schauen Sie sich den Link an, den ich oben veröffentlicht habe, dort finden Sie den Code, um das Problem zu reproduzieren.

Dieselbe Datei wird von demselben Berater geöffnet, 1 Deskriptor zum Schreiben, 2 zum Lesen, fileflush wird nach dem Schreiben verwendet, versuchen Sie zu lesen, und es funktioniert nicht richtig.

Natürlich funktioniert das Schließen/Öffnen, aber dann ist es nicht nötig, FileFlush zu verwenden.

Ich verstehe das Problem, das Sie beschreiben.

Der 1st EA schreibt die Datei. Es kann sein, dass diese Datei nicht geschlossen wird, aber in diesem Fall sollte FileFlush aufgerufen werden

Der 2. Expert Advisor liest die Datei. Es sollte die Datei jedes Mal öffnen und dann schließen.

Öffnen und schließen Sie die Datei nur für den zweiten EA!

 
Slava:

Das ist genau das, wovon ich spreche. Schließen, dann wieder öffnen

Oder meinen Sie FileFlush vor dem Schließen der Datei?

Ja, ist es notwendig, vor dem Schließen zu spülen? Oder ist die Relevanz der aufgezeichneten Datei gewährleistet, wenn sie geschlossen wird?

 
Andrey Barinov :

Ja, ist es notwendig, vor dem Schließen zu spülen? Oder stellt das Schließen sicher, dass die aufgezeichnete Datei aktuell ist.

Die Spülung ist nutzlos, wenn Sie sie unmittelbar danach schließen.
 
Slava :

Ich verstehe das Problem, das Sie beschreiben.

Der 1st EA schreibt die Datei. Es kann sein, dass die Datei nicht geschlossen wird, aber in diesem Fall sollte es FileFlush aufrufen

Der 2. Expert Advisor liest die Datei. Es muss die Datei jedes Mal öffnen und dann schließen.

Öffnen und Schließen der Datei nur für den zweiten EA!

Ich verstehe, dass dies eine Abhilfemaßnahme ist.

Aber es wäre besser, den Fehler zu korrigieren, das ist nicht so einfach möglich, nehme ich an?

 
Andrey Barinov:

Ja, ist es notwendig, vor dem Schließen zu spülen? Oder stellt das Schließen sicher, dass die aufgezeichnete Datei aktuell ist.

Nicht unbedingt. Puffer werden automatisch zurückgesetzt, wenn vor dem Schließen kein FileFlush-Aufruf erfolgt ist

 

Fehler MT5 (Build 2390) zählt geschweifte Klammern in Klassenstrukturbeschreibungen falsch.

class A{};
class B : public A};  // Ok

class C : public A   

void OnStart()
{
   A a;
}                      // Compile Error: '}' - unexpected end of program        
 
Slava:

Ein Expert Advisor, der eine Datei liest, muss diese Datei geschlossen halten.

Die Besonderheit der Implementierung von Dateien in MQL5 ist, dass sie Daten aus Dateien so weit wie möglich in ihren eigenen Puffern halten. Wenn die Informationen so groß sind, dass sie nicht in den Puffer passen, kann Ihr Trick mit dem Verschieben des Zeigers an den Anfang und dann an das Ende der Datei funktionieren.

Also im Moment Datei öffnen, Inhalt prüfen, dann wieder schließen

Wie ich oben (in Ihrem eigenen Text) sagte, ist es in meinem Testfall umgekehrt - Indikator liest, Expert Advisor schreibt. Aber soweit ich weiß, ist die Art des Programms nicht wichtig. Das Problem ist architektonischer Natur.

Die angegebene Datei-Implementierung in MQL5 ist ein Fehler. Das Schließen und Öffnen einer Datei ist ein Workaround, aber beim Lesen einer gemeinsam genutzten Datei sollte es nicht so sein.

Es ist gut, sich um die Leistungsoptimierung zu kümmern, aber es sollte die Funktionalität nicht beeinträchtigen.

PS. Als Quick&Dirty-Fix, hier ein Vorschlag: als Reaktion auf einen FileFlush-Aufruf für eine zum Lesen geöffnete Datei - aktualisieren Sie ihren Puffer.

 
Vict:

Wahrscheinlich, weil µl C++ ähnlich ist und Strukturen von C dorthin kamen.

Wenn Sie Konstruktoren benötigen, verwenden Sie Klassen oder begrüßen Sie Sharp. Warum sollten Sie den Strukturen diese Bedeutung nehmen? Dadurch werden die Programme nur noch ausdrucksstärker. Ich kann den Code von jemandem nehmen und sehen, dass er/sie eine Struktur statt einer Klasse hat und eine Menge Informationen aus nur einem Wort erhalten. Sie werden nichts bekommen, Sie werden fleißig den Quellcode studieren, um das gleiche Ergebnis zu erhalten, das ich in einem Rutsch bekommen habe. Meiner Erfahrung nach wird diese Konvention der Strukturen respektiert, nun ja, vielleicht eine Art windnihilistischer Marginalismus.

Aber in C++ sind Strukturen und Klassen ein und dasselbe. Deshalb berühren all Ihre Überlegungen zur "Ausdruckskraft des Codes" nicht den Kern der Dinge.Sie können genauso gut jedes andere ausdrucksstarke Wort außer struct oder class durch ein define definieren und es wird sich nichts ändern (ich meine C++).

Deshalb sollten wir über Strukturen nur aus der Sicht von C# sprechen, denn von dort stammt ihr Konzept. Strukturen sind Wertetypen, also viel kompakter als Klassen, sie sind nicht polymorph und sie können nicht referenziert werden. Letzteres ist besonders wichtig.

Dort gibt es nichts Böses, so scheint es dir. Es ist sogar in den Standard gestreckt: Lesen uninitialized unsigned char und std::byte ist nicht undefinded Verhalten. Sie können die Aggregatinitialisierung für POD verwenden. Und vergessen Sie nicht - all diese Initialisierung ist nicht kostenlos, es ist echte Ressourcenverbrauch (CPU, Speicher, Größe einer ausführbaren Datei). Wenn es Ihnen bei Ihrem Number Cruncher scheißegal ist, kann es bei einem Mikrocontroller wichtig sein. Schließlich ist C/C++ nicht nur eine Windows-Mischung wie Sharp.

Allein durch die Initialisierung einer Variablen erhöhte sich die Befehlsgröße um 30 %.

Niemand sagt, dass die Initialisierung an sich kostenlos ist, aber man bräuchte sie trotzdem, daher verstehe ich die Bedeutung Ihrer Messungen mit und ohne Initialisierung nicht wirklich.

Eine andere Sache ist, dass der Compiler die Variablen nicht neu initialisiert:

int a= 0;  // Эту инициализацию компилятор вырежет
//...
a= 10;

Die ganze Paranoia über die Angst vor der Vorinitialisierung von Variablen ist also lächerlich. 2020 ist das, vor allem, wenn es sich um POD-Strukturen handelt. Deren Initialisierung wird vom Compiler mit Sicherheit optimiert.

Das Fehlen einer Vorinitialisierung ist nur dann akzeptabel, wenn es eine 100%ige Compilerkontrolle gibt, die das Lesen von nicht initialisierten Variablen verbietet.

 
Alexey Navoykov:

In C++ sind Strukturen und Klassen ein und dieselbe Sache. Alle Ihre Argumente über die "Ausdruckskraft des Codes" berühren also nicht den Kern der Sache.Sie können genauso gut jedes andere ausdrucksstarke Wort als struct oder class durch ein define definieren und es wird sich nichts ändern (ich meine C++)

Was für eine sture Person ))), für dich ist es dasselbe, du brauchst nichts durch ein define zu definieren, es gibt bereits ein Wort - struct. Sie können es ignorieren, aber dann müssen Sie sich nicht wundern, dass anständige Programmierer Sie für einen Scheißprogrammierer halten, wenn sie Ihre mit Funktionen vollgestopften Strukturen sehen. Vielleicht war es ein Fehler in den Anfängen von Crosses, Strukturen und Klassen gleichzusetzen, man hätte Strukturen wie in C belassen sollen.

Deshalb sollten wir über Strukturen nur aus der Sicht von C# sprechen, denn von dort stammt ihr Konzept. Strukturen sind Wertetypen, also viel kompakter als Klassen, sie sind nicht polymorph und können nicht referenziert werden. Letzteres ist besonders wichtig.

Glauben Sie, dass Ihr Sharp auf einem sauberen Feld erschienen ist? Die in C verwurzelte Struktur ist ein stummer Container, der keinen zusätzlichen Zucker enthält.

Eine andere Sache ist, dass der Compiler die Variablen nicht neu initialisiert:

int a= 0;  // Эту инициализацию компилятор вырежет
//...
a= 10;

Die ganze Paranoia über die Angst vor der Vorinitialisierung von Variablen ist also lächerlich. 2020 ist das, vor allem, wenn es sich um POD-Strukturen handelt. Deren Initialisierung wird mit Sicherheit vom Compiler optimiert.

Wie können Sie so sicher sein? Aufruf einer Funktion aus einer anderen Übersetzungseinheit/einem anderen Modul/Zyklen/der Compiler ist nicht in Ordnung/... . Überschätzen Sie nicht die Fähigkeiten des Optimierers. Es handelt sich dabei nicht um eine Copy-Elision-Optimierung, zu der die Compiler verpflichtet sind. Wenn die Optimierer so schlau werden und es nichts mehr kostet, werden sie in den nächsten C-Standard schreiben: "Standardinitialisierung lässt ein Objekt nicht in einem undefinierten Zustand".