Fehler, Irrtümer, Fragen - Seite 2579

 
Roman:

Wieso ist es eine leere Zeichenkette? Wenn die Zeichenkette aus einer Steckdose kommt, ist sie in anderen Varianten zwar krumm, aber sie ist nicht leer.
Ich sage nicht, dass Ihre Variante falsch ist, aber in Ihrer Variante verwenden Sie ein Array von String.
In meinem Fall ist es ein Zeiger.

Die Funktion socket gibt einen Zeiger auf const wchar_t *
zurück. Deshalb schiebe ich den Fehler auf mql, weil ich so viele C-Funktionen ausprobiert habe und hardcore +1 oder +2.
Es wird einfach nicht funktionieren.

Schreiben Sie die Zeilen nach memcpy() parallel in die Datei, wenn mql schuldig ist (es gibt einen Wrapper über den Aufrufen mit Kopierargumenten), dann wird die Datei wahrscheinlich nicht leer sein.

HH: Nun, nur für den Fall - die Bibliotheksfunktion in µl wird mit einem Link deklariert, richtig? void fn(string & s)?
 
Vict:

Schreiben Sie Zeilen nach memcpy() parallel in die Datei, wenn µl schuld ist (es gibt einen Wrapper über Aufrufen mit Kopierargumenten), wird die Datei nicht leer sein, denke ich.

HH: Nun, nur für den Fall - in der µl-Bibliothek wird die Funktion mit einer Referenz deklariert? void fn(string & s)?

Alle Strings zeige ich entweder im Diagramm im Kommentar oder im Druckterminal an, wenn der String ankommt, ist er sofort sichtbar, im Kommentar kann man sehen, ob er schief ist oder nicht.
Bei großen Zeitabständen erscheint die Zeichenkette nur selten auf der Karte, und es entstehen Löcher im Druck.
Der Zweifel, dass keine Zeichenkette von der Buchse kommt, ist ausgeräumt, Tickdaten kommen im Millisekundentakt herein.
Von Socket getData() nahm eine Zeigervariable, von Zeigervariable kopiere ich direkt zu mql, keine Wrapper.
Ja, erklärt durch Feng Shui ))

#import "ExampleDll.dll"
   void Func(string task, string & out);
#import
Im Allgemeinen gibt es ein Problem mit mql string. Viele Varianten ausprobiert und getestet.
Der String von der Buchse kommt mit Terminal Null, und die zuverlässigste Prüffunktion
wcscpy(out, data);
или
wcsncpy(out, data, wcslen(data));  //wcslen(data)+1
zeigt das Problem auf mql.

Im Allgemeinen werde ich sizeof(wichar_t*) für jetzt verwenden und sehen das Verhalten.
Aber wahrscheinlich werde ich, um vor Änderungen durch MQ sicher zu sein, wirklich Strings auf Arrays schreiben.
 
Aber ich denke, um vor Änderungen von MQ sicher zu sein, werde ich die Strings wahrscheinlich wirklich in Arrays schreiben.

Goldene Worte. Natürlich würde ich gerne String verwenden, aber da es keinen Standard gibt, der die Implementierung und/oder das Übertragungsverhalten in der DLL beschreibt, ist es reines ub. Und so, string in short[] und Sie können sicher das Array übergeben; die einzige Sache ist der Overhead der Erstellung und Kopieren eines Arrays.

PS. Dennoch denke ich, dass das Problem nicht in mql liegt, sondern in Ihrem Code. Alle Tests bestanden normal, und es gibt nichts logisch falsch mit String, String ist eine triviale Wrapper über wchar_t *, oder vielmehr über wstring, die es vermasseln könnte.

 
Vladimir Simakov:

Gute Worte. Natürlich würden wir gerne String verwenden, aber da es keinen Standard gibt, der die Implementierung und/oder das Übertragungsverhalten in der DLL beschreibt, ist das reiner Unsinn. Und so, string in short[] und Sie können sicher das Array übergeben; die einzige Sache ist der Overhead der Erstellung und Kopieren eines Arrays.

PS. Dennoch denke ich, dass das Problem nicht in mql liegt, sondern in Ihrem Code. Alle Tests bestanden normal, und es gibt nichts logisch falsch mit String, String ist eine triviale Wrapper über wchar_t *, oder vielmehr über wstring, die es vermasseln könnte.

Ich hatte auch meine Zweifel an der Lib, aber ich schließe nichts als möglichen Grund aus.
Aber ich habe die empfangene Zeichenkette vom Socket in ASCII-Codes umgewandelt, und Sie können sehen, dass die Zeichenkette korrekt ist.
Als nächstes folgt eine einfache Kopie,
mql akzeptiert String-Zeiger nicht korrekt.

Dateien:
1.PNG  32 kb
 
Roman:

Alle Linien, die ich entweder auf dem Diagramm im Kommentar oder im Druckterminal anzeige, wenn die Linie kommt, ist sie sofort im Kommentar sichtbar, ob sie schief ist oder nicht.
Bei großen Zeitverzögerungen erscheint die Linie nur selten im Diagramm, während der Druck lückenhaft ist.
Der Zweifel, dass der String aus der Steckdose nicht ankommt, die Tickdaten kommen im Millisekundentakt an.
Vom Socket wird getData() in eine Zeigervariable übernommen, von der Zeigervariable kopiere ich sofort in mql, keine Wrapper.
Ja, erklärt durch Feng Shui ))

Im Allgemeinen gibt es ein Problem mit mql string. Viele Varianten ausprobiert und getestet.
Der String von der Buchse kommt mit Terminal Null, und die zuverlässigste Prüffunktion
zeigt das Problem auf mql.

Im Allgemeinen werde ich sizeof(wichar_t*) für jetzt verwenden und sehen das Verhalten.
Aber wahrscheinlich werde ich, um vor Änderungen durch MQ sicher zu sein, wirklich Strings auf Arrays schreiben.

Schreiben in die Datei - ich meinte auf der DLL-Seite, wenn die Datei geschrieben wird, aber nicht in die μl kommt, ist das schon ein gewichtiges Argument mit einer Fehlerbehauptung, vielleicht korrigiert.

Und es gibt einen Wrapper ohne Ihren Wunsch, MQ verstecken Code/Adressen von der Außenwelt, alles geht nicht direkt.

 
Vict:

Schreiben in die Datei - ich meinte auf der DLL-Seite, wenn es in die Datei schreibt, aber nicht zu mql kommt, dann ist es schon ein starkes Argument mit Fehleranspruch, vielleicht korrigiert.

Und es gibt einen Wrapper ohne Ihren Wunsch, MQs verbergen Code/Adressen vor der Außenwelt, alles geht nicht direkt.

Schreibt die empfangenen Zeichenfolgen in eine Datei.
Da die Socket-Funktion einen Zeiger auf eine Zeichenkette zurückgibt, wird ein Zeiger auf die Zeichenkette in die Datei geschrieben, und dann wird dieser Zeiger in mql kopiert.
Mit der Funktion

wcscpy(out,  data);

Die Länge der resultierenden Zeichenkette beträgt 164, der mql wird 200 zugewiesen.

StringInit(out, 200, 32);

Die kopierte Zeichenkette, die in mql empfangen wird, ist gleich lang, allerdings gibt es einige Lücken beim Kopieren.
Im mql-Skript wird die while-Schleife mit Sleep(1) durchlaufen

Dateien:
458.PNG  71 kb
 
Und wenn Sie die Funktion
wcsncpy(out, data, wcslen(data));
Dann gibt es keine Lücken, aber die kopierten Zeilen sind nicht gerade, es gibt zusätzliche Zeichen am Ende der Zeile.
Das Hinzufügen vonwcslen(data)+1 ist nichthilfreich.

Unterm Strich, von allen Seiten, die ich hier schreibe.
mql string akzeptiert nicht korrekt von dll, kopiert Zeiger auf string const wchar_t*
Dateien:
w6b.PNG  74 kb
qjv2.PNG  73 kb
09i3.PNG  6 kb
 
Roman:

Richtig, ich weise einen Puffer für string out zu und initialisiere ihn mit Leerzeichen.
Dann übergebe ich diesen String (Zeiger) an dll.

In der dll wchar_t* werden die Daten nach out kopiert, d.h. sie sind 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 eine Zeichenkette als Zeiger, also sollte die Größe an den Zeiger übergeben werden, nicht der Typ.

Manchmal macht man es richtig und es funktioniert nicht.

Wenn man es falsch macht, scheint es zu funktionieren.

In solchen Fällen muss man es richtig machen und den Fehler woanders suchen.

 
Roman:

Die resultierende Zeichenkette wird in eine Datei geschrieben.
Da die Socket-Funktion einen Zeiger auf eine Zeichenkette zurückgibt, wird ein Zeiger auf die Zeichenkette in die Datei geschrieben und dieser Zeiger dann in mql kopiert.
Mit der Funktion

Die Länge der resultierenden Zeichenkette beträgt 164, der mql wird 200 zugewiesen.

Die kopierte Zeichenkette, die in mql empfangen wird, ist gleich lang, aber es gibt einige Lücken beim Kopieren.
Im mql-Skript wird die while-Schleife mit Sleep(1) durchlaufen

1. In MQL wird eine Zeichenkette, nicht ein Zeiger, kopiert.

2. Sie haben in MQL eine Zeichenkette mit 200 Zeichen ausgewählt. Dann haben Sie 164 Zeichen hineingeschrieben. Schauen Sie sich danach die Größe der Linie in MQL an. Es blieb bei 200.

 
Koldun Zloy:

Manchmal macht man es richtig und es funktioniert nicht.

Wenn man es falsch macht, scheint es zu funktionieren.

In solchen Fällen müssen Sie das Richtige tun und den Fehler woanders suchen.

Um es richtig zu machen, habe ich also memcpy aufgegeben und wcscpy oder wcsncpy verwendet.
Ergebnis, Beitrag oben.

Grund der Beschwerde: