Fehler, Irrtümer, Fragen - Seite 2724
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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.
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!
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?
Ja, ist es notwendig, vor dem Schließen zu spülen? Oder stellt das Schließen sicher, dass die aufgezeichnete Datei aktuell ist.
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?
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.
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.
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:
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.
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:
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.