Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 599
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
Hallo!
Können Sie mir sagen, wie ich den Cursor in einem Textdokument z. B. auf Zeile 7 bewegen kann, um eine Teilzeichenkette von dieser Position aus zu extrahieren?
Was ist schneller - mehrere Textdateien mit einer Zeile oder eine Datei mit mehreren Zeilen?
Sie müssen wissen, wie viele Bytes in einer Zeile sind, und den Zeiger auf 6 solcher Werte vom Anfang der Datei verschieben.
Hallo!
Was ist schneller - viele Textdateien mit einer Zeile oder eine Datei mit vielen Zeilen?
Dies hängt von der spezifischen Implementierung des Algorithmus und dem zu lösenden Problem ab. Vielleicht ist in Ihrem Fall die erste Option schneller, aber ich würde an Ihrer Stelle nicht über die Leistung nachdenken.
Bitte sagen Sie mir, wie ich den Cursor z. B. in die 7. Zeile eines Textdokuments bewegen kann, um die Teilzeichenkette bereits ab dieser Position zu extrahieren...
Lesen Sie die Standarddokumentation. Der Abschnitt über dieDateioperationen. Zum Beispiel können Sie eine Datei zeilenweise mit FileReadString lesen, ein Beispiel ist direkt aus der Dokumentation:
Können Sie mir sagen, wie ich den Wert eines Mausklicks in einem Diagramm in einen Preiswert umwandeln kann oder umgekehrt?
Wie kann ich den Wert eines Mausklicks in einem Diagramm in einen Preiswert umwandeln oder umgekehrt?
Verwenden Sie die Funktion ChartXYToTimePrice. Siehe "Operationen mit Diagrammen" in der Dokumentation.
Verwenden Sie die Funktion ChartXYToTimePrice. Siehe "Operationen mit Diagrammen" in der Dokumentation.
Ich danke Ihnen.
Sie haben also einen Fehler mit CArrayObj. Statt: CArrayObj test_objects; Sie schrieben: CArrayObj* test_objects, vergaßen aber, einen Destruktor dafür zu erstellen; Vielleicht haben sie das Speichermodell für die Arbeit mit CArrayObj falsch konfiguriert. Vielleicht haben es die Programmierer mit den Zeigern einfach übertrieben. Die Diagnose ist eindeutig: Die Verwendung von Zeigern an Stellen, an denen sie nicht benötigt werden, führt häufig zu Lecks.
Es gibt eine Funktion in irgendeiner Klasse. Ich deklariere darin ein Array von CArrayObj-Objekten. Ich füge globale Klassenobjekte hinzu. Wenn die Funktion beendet ist, ist das Array der Objekte selbst nicht mehr erforderlich. Die Objekte werden natürlich benötigt.
Wenn ich das Array als Zeiger CArrayObj *test_objects erstelle, erhalte ich ungelöschte Objekte im Protokoll, was am Ende zu einem Out-of-Memory-Fehler führen wird.
Wenn ich das Array als CArrayObj test_objects deklariere und ihm Objekte hinzufüge, dann stellt sich heraus, dass, wenn die Funktion endet und die Objekte nicht mehr verfügbar sind, weil das Array mit den Objekten sozusagen gelöscht wird...
Wenn ich ein Array als CArrayObj test_objects deklariere und ihm Objekte hinzufüge, dann stellt sich heraus, dass die Objekte nicht mehr verfügbar sind, wenn die Funktion endet, weil das Array mit den Objekten sozusagen gelöscht wird...
Das ist richtig, denn in diesem Fall platzieren Sie CArrayObj test_objects auf dem Stack und im Adressraum der Funktion. Wenn die Funktion beendet wird, wird der Adressraum der Funktion überschrieben, einschließlich Ihrer CArrayObj test_objects.
Die Funktion wird beendet, das Objektarray selbst wird nicht benötigt. Die Objekte werden natürlich benötigt.
Denken Sie ein für alle Mal daran: Wenn Sie Objekte innerhalb eines CArrayObjs benötigen, brauchen Sie auch das CArrayObj selbst. CArrayObj ist eine obligatorische Verpackung. Sie können nicht darauf verzichten, ganz einfach.
Wenn ich ein Array als Zeiger CArrayObj *test_objects, dann bekomme ich ungelöschte Objekte in das Protokoll, die schließlich zu einem out of memory Fehler führen wird.
In diesem Fall wird ein Zeiger auf ein CArrayObj-Objekt auf dem Heap erzeugt. Der Heap ist ein Segment des Programmadressraums, in dem Speicher mit Hilfe der entsprechenden new- und delete-Operatoren manuell zugewiesen und gelöscht wird. Das heißt, wenn Sie new schreiben, muss es irgendwo eine Spiegelung von delete geben. Außerdem können Neu und Löschen in verschiedenen Teilen des Programms liegen, zum Beispiel in verschiedenen Methoden:
Wenn nach dem Aufruf von foo_analize noch Objekte benötigt werden, kann der Löschoperator an einer anderen Stelle platziert werden, an der garantiert Objekte benötigt werden. Ein solcher universeller Ort kann z. B. OnDeinit sein, das aufgerufen wird, bevor das Programm geschlossen wird.
Denken Sie an die Hauptsache, wenn es einen neuen Operator gibt, muss es immer auch einen Löschoperator dafür geben. Andernfalls kommt es zu Speicherlecks. Die Operatoren "Neu" und "Löschen", die dasselbe Objekt bearbeiten, müssen nicht "nebeneinander" in derselben Methode stehen. Löschen kann an einem beliebigen Ort weit entfernt von der Speicherzuweisung erfolgen, solange delete einen Verweis auf das ausgewählte Objekt im Heap hat.
** Obwohl das stimmt, sollten wir solche Konstrukte besser vermeiden, denn wir müssen immer sehr vorsichtig sein, wo und unter welchen Umständen der Löschoperator aufgerufen wird, was nicht immer offensichtlich ist. Stattdessen müssen Sie nur lernen, wie man Klassen verwendet. Mit dieser Klasse können Sie automatisch Objekte auf dem Heap platzieren und löschen, ohne die Operatoren new und delete zu verwenden:
Diese Klasse enthält nicht explizit Zeiger. Sie brauchen also nicht sowohl neu als auch löschen zu verwenden. Nach dem Beenden des Programms gibt die Klasse automatisch alle CItem- und CArrayObj-Objekte frei, was das Leben des Entwicklers erheblich erleichtert.
Das ist richtig, denn in diesem Fall legen Sie CArrayObj test_objects auf den Stack und den Funktionsadressraum. Wenn Sie die Funktion beenden, wird der Adressraum der Funktion überschrieben, einschließlich Ihrer CArrayObj test_objects.
Denken Sie ein für alle Mal daran: Wenn Sie Objekte innerhalb eines CArrayObjs benötigen, brauchen Sie das CArrayObj selbst. CArrayObj ist ein obligatorisches Paket. Sie können nicht darauf verzichten, ganz einfach.
In diesem Fall wird ein Zeiger auf ein Objekt CArrayObj auf dem Heap erstellt. Der Heap ist ein Segment des Programmadressraums, in dem Speicher mit Hilfe der entsprechenden new- und delete-Operatoren manuell zugewiesen und gelöscht wird. Das heißt, wenn Sie new schreiben, muss es irgendwo eine Spiegelung von delete geben. Außerdem können Neu und Löschen in verschiedenen Teilen des Programms liegen, zum Beispiel in verschiedenen Methoden:
Wenn nach dem Aufruf von foo_analize noch Objekte benötigt werden, kann der Löschoperator an einer anderen Stelle platziert werden, an der garantiert Objekte benötigt werden. Ein solcher universeller Ort kann z. B. OnDeinit sein, das aufgerufen wird, bevor das Programm geschlossen wird.
Denken Sie an die Hauptsache, wenn es einen neuen Operator gibt, muss es immer auch einen Löschoperator dafür geben. Andernfalls kommt es zu Speicherlecks. Die Operatoren "Neu" und "Löschen", die mit demselben Objekt arbeiten, müssen sich nicht "nebeneinander" in derselben Methode befinden. Löschen kann an einem beliebigen Ort weit entfernt von der Speicherzuweisung erfolgen, solange delete einen Verweis auf das zugewiesene Objekt im Heap hat.
** Obwohl das stimmt, sollten wir solche Konstrukte besser vermeiden, denn wir müssen immer sehr vorsichtig sein, wo und unter welchen Umständen der Löschoperator aufgerufen wird, was nicht immer offensichtlich ist. Stattdessen müssen Sie nur lernen, wie man Klassen verwendet. Mit dieser Klasse können Sie automatisch Objekte auf dem Heap platzieren und löschen, ohne die Operatoren new und delete zu verwenden:
Diese Klasse enthält nicht explizit Zeiger. Sie brauchen also nicht sowohl neu als auch löschen zu verwenden. Nach Beendigung des Programms gibt die Klasse automatisch alle CItem- und CArrayObj-Objekte frei, was dem Entwickler das Leben erleichtert.
Ich danke Ihnen. Aber ich habe keine Antwort auf meine Frage gefunden. Wo sollte ich löschen, wenn ich einen Zeiger deklariere. Ich wiederhole, das CArrayObj-Objekt wird in einer Funktion deklariert... wie kann ich es in Deinit() löschen?
Zuvor habe ich das Problem jedoch folgendermaßen gelöst. Bevor Sie die Funktion beenden:
Ich danke Ihnen. Ich konnte einfach keine Antwort auf meine genaue Frage finden. Wo soll ich löschen, wenn ich einen Zeiger deklariere. Auch hier ist das CArrayObj-Objekt in einer Funktion deklariert... wie kann ich es in Deinit() löschen?
Dies ist kein Telepathenclub. Sie haben Ihren Code nicht beigefügt, so dass Sie selbst entscheiden können, wo Sie löschen möchten.
Falsch.