Fehler, Irrtümer, Fragen - Seite 2577

 
Igor Makanu:

Ich kenne diese Option.

Dann Division durch Null.

 
fxsaber:

Dann Division durch Null.

Ng...es gab Hoffnung, aber wie immer nur Hardcore ))))

 
Vict:

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

 
Vict:

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,

memcpy_s(out, wcslen(data) * sizeof(wchar_t*), data, wcslen(data) * sizeof(wchar_t*));

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!

 
A100:

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.

 
A100:

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.

 
Auch beschlossen, die empfangene Zeichenfolge in der DLL, für das Vorhandensein von Terminal Null zu überprüfen.
Die Null ist vorhanden
for (int index = 0; index <= wcslen(data); ++index)
   wcout << static_cast<int>(data[index]) << " ";
123 34 101 34 58 34 97 103 103 84 114 97 100 101 34 44 34 69 34 58 49 53 54 57 54 50 52 50 50 57 50 51 54 44 34 115 34 58 34 66 84 
67 85 83 68 84 34 44 34 97 34 58 49 54 54 50 49 57 49 55 53 44 34 112 34 58 34 56 50 48 50 46 49 48 48 48 48 48 48 48 34 44 34 113 
34 58 34 48 46 48 51 51 50 51 48 48 48 34 44 34 102 34 58 49 56 51 57 54 49 54 55 50 44 34 108 34 58 49 56 51 57 54 49 54 55 50 44 
34 84 34 58 49 53 54 57 54 50 52 50 50 57 50 51 49 44 34 109 34 58 116 114 117 101 44 34 77 34 58 116 114 117 101 125 0
 
Roman:

Wenn Sie darauf bestehen, machen Sie es auf Ihre Weise.

 
Roman:

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.

 
Koldun Zloy:

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.

string out;
StringInit(out, 1400, 32);

Func(out);

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.