Fehler, Irrtümer, Fragen - Seite 2577
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
Ich kenne diese Option.
Dann Division durch Null.
Dann Division durch Null.
Ng...es gab Hoffnung, aber wie immer nur Hardcore ))))
ZS: vielleicht gar nicht mit Strings? speichern Arrays in wchar_t und Rennen, und innerhalb der µl konvertieren in String, wenn nötig https://www.mql5.com/ru/docs/convert/shortarraytostring
Einverstanden
Forum für Handel, automatisierte Handelssysteme und Strategietests
WinAPI -> MQL5 x64
A100, 2018.05.29 14:11
Alle Regeln sind gesagt worden. Wenn Sie wollen, dass es immer funktioniert - müssen Sie ushort verwenden, und wenn Sie verstehen wollen, warum string plötzlich nicht mehr funktioniert (was gestern funktionierte) - können Sie string verwenden
hier überschreiten Sie die Grenzen
Sie haben mich auf die Idee gebracht, die Länge der initialisierten Zeichenfolge in StringInit(out, 165, 32) zu überprüfen;
Die StringInit-Hilfe sagt, dass der zweite Parameter die Stringlänge ist, die Stringlänge in meinem Verständnis ist die Anzahl der Zeichen der Zeichenfolge.
In meinem Fall hat die eingehende Zeichenfolge 164 Zeichen, also habe ich 165 in den zweiten Parameter eingegeben und mehr als *2, 330 ausprobiert.
Verwendung vonmemcpy_s mit einem Zeiger,
Das Ergebnis war dasselbe, das Ende der Zeichenkette wird immer um die Anzahl der Zeichen verschoben, und beim Parsen kommt es zu Lecks.
Ohne einen Zeiger ist die Zeichenkette ebenfalls fließend.
Aber du hast mich auf eine Idee gebracht, und in StringInit(out, 1400, 32) habe ich die Zeigergröße in Bytes festgelegt, nicht die Stringlänge.
Und voila Wunder, der String wurde ohne zusätzliche Ausgabezeichen, ohne Probleme beim Parsen und ohne ein einziges Leck.
Ich möchte darauf hinweisen, dass es mit dem Zeiger in sizeof ist, ohne den Zeiger die Zeichenfolge fließt.
Dies wirft eine Frage an Entwickler, ist Hilfe auf StringInit richtig?
Wird in der Hilfe oder in der StringInit-Funktion selbst nicht die Länge der Zeichenfolge mit der Größe der Zeichenfolge verwechselt?
Im Allgemeinen, wenn Sie jetzt memcpy verwenden, funktioniert es korrekt, wenn Sie die Zeigergröße übergeben und StringInit wird mit dieser Größe initialisiert, nicht die Länge!
Einverstanden
Ja, das sehe ich auch so. Aber es ist nicht immer bequem, String als Array zu verwenden, besonders wenn dieser String durch mehrere Funktionen geleitet werden muss.
Zeiger sind in diesem Fall bequemer, da man das Array nicht bei jeder Transitfunktion neu füllen muss und zusätzlich einen weiteren Parameter für das Array, seine Größe, angeben kann.
Sie haben also einfach einen Puffer zugewiesen, der absichtlich überdimensioniert ist (die Grenze zurückgeschoben), und der Fehler taucht einfach nicht auf - weil er an der Grenze lag
Das dachte ich auch, die Saitenlänge ist 164, eingestellt 165, eingestellt 330.
330 ist eindeutig keine Grenze für die Länge von Zeichenketten, wenn man diese in Zeichen zählt.
Es stellt sich heraus, dass es sich nicht um die Länge, sondern um die Größe der Bytes handelt.
Aber die Hilfe schlägt das Gegenteil vor, dass es die Länge inStringInit sein sollte.
Im Allgemeinen, wie ich die mql's String-Typ verstanden ist ein Zeiger und Sie sollten diesen Typ wie ein Zeiger behandeln.
Die Null ist vorhanden
Wenn Sie darauf bestehen, machen Sie es auf Ihre Weise.
Das dachte ich auch. 164 ist die Länge der Saite, ich habe sie auf 165 und dann auf 330 eingestellt.
330 ist offensichtlich keine Grenze für die Länge von Zeichenketten, wenn man diese in Zeichen zählt.
Es stellt sich heraus, dass es sich nicht um die Länge, sondern um die Größe der Bytes handelt.
Aber die Hilfe schlägt das Gegenteil vor, nämlich dass es die Länge in StringInit sein sollte.
Im Allgemeinen, wie ich die mql's String-Typ verstanden ist ein Zeiger und Sie sollten diesen Typ wie ein Zeiger behandeln.
Der mql-Typ string ist eine Struktur, die einen Zeiger, die Länge der Zeichenkette und möglicherweise etwas anderes enthält.
Wenn Sie eine Zeichenkette an die DLL übergeben, wird nur der Zeiger übergeben. Die Länge der Zeichenkette muss manuell eingegeben werden.
Achten Sie immer darauf, dass die Schnur nicht zu groß ist.
Alle Änderungen der Stringgröße sind nur auf der MMS-Seite.
Auf der DLL-Seite sollten Sie die Hilfe zu den Funktionen, die Sie verwenden, sorgfältig lesen. Das ist das einzige Problem, das Sie haben.
sizeof( wchar_t* ) gibt die Zeigergröße zurück. Das ist nicht das, was Sie wirklich brauchen.
Der mql-Typ string ist eine Struktur, die einen Zeiger, die Länge der Zeichenkette und möglicherweise etwas anderes enthält.
Wenn Sie eine Zeichenkette an die DLL übergeben, wird nur der Zeiger übergeben. Die Länge der Zeichenkette muss manuell eingegeben werden.
Achten Sie immer darauf, dass die Schnur nicht zu groß ist.
Alle Änderungen der Stringgröße sind nur auf der MMS-Seite.
Auf der DLL-Seite sollten Sie die Hilfe zu den Funktionen, die Sie verwenden, sorgfältig lesen. Das ist das einzige Problem, das Sie haben.
sizeof( wchar_t* ) gibt die Zeigergröße zurück. Das ist nicht das, was Sie überhaupt brauchen.
Richtig, ich weise einen Puffer für die Zeichenfolge aus, und initialisieren Sie es mit Leerzeichen.
Dann übergebe ich diesen String (Zeiger) an dll.
In der dll werden die wchar_t*-Daten nach out kopiert, d.h. auch ein Zeiger. Logischerweise sollte es keine Probleme geben.
So wie ich es nach der Hilfe verstehe, sollte die StringInit-Funktion die Stringlänge festlegen.
Aber ich habe immer noch einige Probleme mitder StringInit-Funktion selbst; Ich habe die Stringlänge angegeben und bekam seltsam, wenn ich auf die Zeigergröße zeigte.
Ich verstehe nicht, welche manuelle Übertragung der Saitenlänge Sie meinen.
Und wenn Sie sizeof(wchar_t) ohne Zeiger verwenden, fängt die Zeichenkette an, mit zusätzlichen Zeichen umherzuschweben, was Probleme beim Parsen und Auslaufen verursacht.
Für die Übergabe von Strings in die DLL habe ich das Beispiel von Renat aus seinem Artikel über das Schreiben einer DLL verwendet.
Aber aus irgendeinem Grund, wenn ich es ohne sizeof(wchar_t) Zeiger übergeben, die Zeichenfolge fließt, während mit sizeof(wchar_t*) Zeiger gibt es kein Problem.
Es erscheint mir logisch, ich kopiere einen String als Zeiger, die Größe sollte an den Zeiger übergeben werden, nicht der Typ.