Fehler, Irrtümer, Fragen - Seite 2461

 
fxsaber:

Könnten Sie diesen Punkt näher erläutern?

Dies ist meine subjektive Meinung, wenn ich irgendwo falsch liege, helfe ich gerne weiter.


StringLen arbeitete früher mit O(n) bis zum ersten NULL-Zeichen (0x0000) in der Zeichenkette, jetzt arbeitet es mit O(1).
DieLänge von Zeichenketten konnte immer über StringSetCharacter(str, pos, 0x00) abgeschnitten werden, aber aus irgendeinem Grund wurde StringSetLength eingeführt.

Wahrscheinlich wurde die Aufgabe der Code-Beschleunigung bei der Arbeit mit Strings gelöst.
Die Aufgabe, den Code zu beschleunigen, wurde gelöst, und niemand kümmert sich darum, dass die Hälfte der Funktion nun NULL-Zeichen in Strings verarbeitet und die andere Hälfte nicht.

#define  PRINT(x) Print(#x, ":", string(x))

void OnStart(){  
   string str = "123456789";
   PRINT(str);
   PRINT(StringLen(str));
   
   PRINT(StringSetCharacter(str, 7, 0x00));
   PRINT(StringLen(str));
   
   str += "\x00" + str;
   PRINT(StringLen(str));
   
   str += str;
   PRINT(str);
   PRINT(StringLen(str));
   
   ushort array[];
   PRINT(StringToShortArray(str, array));
   ArrayPrint(array);
   
   PRINT(StringLen(str));
   PRINT(StringLen(ShortArrayToString(array)));
   PRINT(StringLen(ShortArrayToString(array, 0, StringLen(str))));
} 

Das Ergebnis:

2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:123456789
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):9
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringSetCharacter(str,7,0x00):true
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):15
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      str:1234567
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringToShortArray(str,array):31
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      49 50 51 52 53 54 55  0 49 50 51 52 53 54 55 49 50 51 52 53 54 55  0 49 50 51 52 53 54 55  0
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(str):30
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array)):7
2019.05.15 14:02:11.895 StringFormat_1 (EURUSD,H1)      StringLen(ShortArrayToString(array,0,StringLen(str))):7
 
Sergey Dzyublik:

Dies ist meine subjektive Meinung, wenn ich irgendwo falsch liege, helfe ich gerne weiter.


StringLen arbeitete früher mit O(n) bis zum ersten NULL-Zeichen (0x0000) in der Zeichenkette, aber jetzt arbeitet es mit O(1).
DieLänge von Zeichenketten konnte immer über StringSetCharacter(str, pos, 0x00) abgeschnitten werden, aber aus irgendeinem Grund wurde StringSetLength eingeführt.

Wahrscheinlich wurde die Aufgabe der Code-Beschleunigung bei der Arbeit mit Strings gelöst.
Die Aufgabe, den Code zu beschleunigen, wurde gelöst und niemand kümmert sich darum, dass die Hälfte der Funktion nun NULL-Zeichen in Strings verarbeitet und die andere Hälfte nicht.


Das Ergebnis:

Bitte zügeln Sie Ihre Gefühle.
Wenn Sie das nächste Mal unflätige Worte benutzen, müssen Sie ausgeschlossen werden - wir sind hier nicht in einer Kneipe. Und es ist nicht mehr in Mode, in einer Kneipe zu fluchen.
 
Sergey Dzyublik:

StringLen arbeitete früher mit O(n) bis zum ersten NULL-Zeichen (0x0000) in der Zeichenkette, jetzt arbeitet es mit O(1)

Nur teilweise behobene Bugs ... warum nicht!? Meiner Erinnerung nach hat StringLen immer korrekt funktioniert (zumindest in x32)
 
Sergey Dzyublik:
An die Entwickler:
Bitte fügen Sie die Möglichkeit hinzu, erzwungene Codegenerierung für den Standard-Zuweisungsoperator (Kopierkonstruktor) anzugeben:

Es ist ein bisschen kompliziert. Es ist einfacher, die Analogie des Standardkonstruktors zu verwenden:

1) Jeder Zuweisungsoperator überschreibt den Standard-Zuweisungsoperator

2) jeder Kopieroperator überschreibt den Standard-Kopieroperator

 
A100:
Nur teilweise korrigierte Fehler ... warum nicht!?

Da MQL keine konsistente Idee hat, wenn es um Strings mit NULL-Zeichen geht, ist dies das Problem.
Zum Beispiel unterstützt StringToShortArray NULL-Zeichen in einer Zeichenkette, während die umgekehrte Funktion ShortArrayToString dies nicht tut...

Dies hat zur Folge, dass mehr Zeit auf das Aufspüren von Fehlern und die Suche nach Umgehungsmöglichkeiten verwendet wird, als auf die Lösung bestimmter Aufgaben.

 
A100:

Es ist ein bisschen kompliziert. Es ist einfacher, die Analogie des Standardkonstruktors zu verwenden:

1) Jeder Zuweisungsoperator überschreibt den Standard-Zuweisungsoperator

2) jeder Kopieroperator hebt den Standard-Kopieroperator auf

Ich brauche keine Rückgängigmachung, ich brauche im Gegenteil eine erzwungene Erzeugung.
MQL hat keine Funktionalität für tiefe Kopien von komplexen Typen, und in Zuweisungsoperator und Kopierkonstruktor sind sie standardmäßig implementiert.

 
Sergey Dzyublik:

Da es in MQL kein einheitliches Konzept für den Umgang mit Strings mit NULL-Zeichen gibt, ist dies das Problem.
Zum Beispiel unterstützt StringToShortArray NULL-Zeichen in einer Zeichenkette, während seine umgekehrte Funktion ShortArrayToString dies nicht tut...

Einerseits ja, andererseits heißt es in der Dokumentation ausdrücklich: "oder bis zum Erreichen der Klemme 0".

 
Sergey Dzyublik:
Nun, es ist irgendwie unklar, warum die Null-Linien von den Plus-Linien überhaupt gezogen wurden.
 
A100:

Einerseits ja, andererseits wird in der Dokumentation ausdrücklich darauf hingewiesen (dass dies nicht der Fall ist)

UndStringToShortArray sagt das Gleiche:

 Количество элементов массива для копирования. Определяет длину результатной строки. По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0.

Dies hindert ihn jedoch nicht daran, NULL-Zeichen in der Zeichenkette angemessen zu behandeln.

 
Hallo. Die mobile Version des MT5 verbindet sich nicht mit meinem Alpari-Broker. Was ist das Problem? Wird dieses Problem irgendwann behoben werden?