Fehler, Irrtümer, Fragen - Seite 3021

 
fxsaber:

Der Fehler ist die Diskrepanz zwischen den beiden Funktionen, nicht das Ergebnis, denn es ist nur eine Frage der Dokumentation, was bei count=0 ausgegeben werden soll.

Nein, es gibt auch so etwas wie ein Einheitlichkeitsprinzip. Der Fehler ist offensichtlich. Wenn Sie nicht verstehen, warum es ein Fehler ist, ist das Ihr Problem.

 
fxsaber:

Der Fehler liegt in der Diskrepanz zwischen den beiden Funktionen, nicht in ihrem Ergebnis, da es nur eine Frage der Dokumentation ist , was bei count=0 ausgegeben werden soll.

Forum zum Thema Handel, automatische Handelssysteme und Strategietests

Fehler, Irrtümer, Fragen

Roman, 2021.05.07 22:07

Der ganze Trick steht in der Funktionsbeschreibung ))

[in]  Количество элементов массива для копирования. Определяет длину результатной строки. 
По умолчанию -1, что означает копирование до конца массива, либо до встречи терминального 0. 
Терминальный 0 также будет скопирован в массив-приемник, 
при этом размер динамического массива может быть увеличен при необходимости под размер строки. 
Если размер динамического массива больше длины строки, то размер массива уменьшен не будет. 

automatischer Fortschritt ))
was den Benutzer mehr verwirrt.

A100:

Und wie würde ein Praktiker ein solch widersprüchliches Ergebnis den Theoretikern erklären?

Ergebnis: 4:0

Erwartetes Ergebnis: 0:0

Oder auch - um die Dokumentation ein wenig zu korrigieren? Also doch nicht, um Fehler zu beheben!

Meine Erklärung ist einfach: eine dieser Standardfunktionen hat einen Fehler - und ich weiß sogar welche


 
Roman:

Danach haben die Entwickler bereitskorrigiert, so dass Ihre vorherige Erklärung nicht mehr gültig ist.

Die Funktionen sind die gleichen (sie unterscheiden sich nur im Typ, nämlich der Vorlage), die Beschreibung ist die gleiche (es gibt sogar Querverweise), aber das Ergebnis ist anders

 
A100:

Die Entwickler haben das Problem bereits behoben, so dass Ihre vorherige Erklärung nicht zutrifft.

Was genau wurde behoben?
Das war schon immer so, wie es in der Dokumentation steht.

str1

str1


Haben Sie überprüft, was behoben wurde? ))
Behoben, wie gewünscht aufgeteilt.
3 Zeichen, zum Beispiel.

char ch[];
int str = StringToCharArray( "ABCDEF", ch, 0, 3 );
    
Print("StringToCharArray "+(string)str);
Print("ch[] ",CharToString(ch[0]), CharToString(ch[1]), CharToString(ch[2]));
Print("GetLastError ", GetLastError());         

2021.05.25 02:08:33.329 Test (AUDUSD,M1)   StringToCharArray 3
2021.05.25 02:08:33.329 Test (AUDUSD,M1)   ch[] ABC
2021.05.25 02:08:33.329 Test (AUDUSD,M1)   GetLastError 0

Wenn Sie jedoch 0 in count übergeben, wird automatisch die gesamte Zeichenkette mit einer endenden Null kopiert.
Auch wenn die Zeichenkette leer ist, wird eine endende Null kopiert.

char ch[];
int str = StringToCharArray( "", ch, 0, 0 );
    
Print("StringToCharArray "+(string)str);
2021.05.25 02:24:47.161 Test (AUDUSD,M1)   StringToCharArray 1
Und StringLen() gibt keine abschließende Null zurück ))
 
Roman:

Was genau haben Sie repariert?

Wenn Sie jedoch 0 an count übergeben, wird automatisch die gesamte Zeichenkette mit einer endenden Null kopiert.
Auch wenn die Zeichenkette leer ist, wird die endende Null kopiert.

Warum ist es inStringToShortArray anders? Bitte erklären Sie kurz und knapp, wenn möglich, ohne Tricks und obskure Verweise auf Ihre früheren brillanten Erklärungen (die am Ende gescheitert sind) - in einfachen Worten - für einen Dummkopf

ohne ; ) und andere unpassende Symbole in diesem Thema.

 
A100:

Warum ist es inStringToShortArray anders? Bitte erklären Sie kurz, wenn möglich, ohne Tricks und unverständliche Verweise auf Ihre früheren brillanten Erklärungen (die am Ende gescheitert sind) - in einfachen Worten - für einen Dummkopf

ohne ; ) und andere irrelevante Symbole in diesem Thema.

Geteilte Arbeiten

ushort sh[];
int str = StringToShortArray( "ABCDEF", sh, 0, 3 );
    
Print("StringToShortArray "+(string)str);
Print("sh[] ",ShortToString(sh[0]), ShortToString(sh[1]), ShortToString(sh[2]));
Print("GetLastError ", GetLastError()); 
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   StringToShortArray 3
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   sh[] ABC
2021.05.25 03:10:07.696 Test (AUDUSD,M1)   GetLastError 0

Ich weiß nicht, warum der Zähler 0 nicht funktioniert.
Vielleicht funktioniert diese intelligente Automatik bei Zählung 0 hier nicht, und laut der Hilfe ist es bereits eine Fehlanpassung.
Und das muss ein Fehler sein.

ushort sh[];
int str = StringToShortArray( "ABCDEF", sh, 0, 0 );
    
Print("StringToShortArray "+(string)str);
//Print("sh[] ",ShortToString(sh[0]), ShortToString(sh[1]), ShortToString(sh[2]));
Print("GetLastError ", GetLastError()); 
2021.05.25 03:12:00.176 Test (AUDUSD,M1)   StringToShortArray 0
2021.05.25 03:12:00.176 Test (AUDUSD,M1)   GetLastError 0

Wie auch immer, entweder gibt es einen Fehler hier, dienicht aufZählung 0funktioniert,
oder es gibt einen Fehler in StringToCharArray, die auf
Zählung 0 funktioniert.

Damit Sie die Richtigkeit der Erklärungen verstehen, sollten Sie die Grundlagen der Sprache C studieren, insbesondere den Umgang mit Zeichenketten.
Dann wird es keine Fragen geben.

 
Roman:

Kurz gesagt, entweder gibt es einen Fehler hier, dass count 0 nicht funktioniert,
oder es gibt einen Fehler in StringToCharArray, dass count 0 funktioniert.

Hervorragend!

 
A100:

Hervorragend!

Natürlich ist das genial. Die Hilfe gibt nicht explizit Auskunft über die Behandlung derAnzahl 0.
Aber wenn man den Kopf dreht, ist die Übergabe einer Größe von Null an das Array und die Zuweisung von Null Speicher für dieses Array gelinde gesagt seltsam.
Deshalb wird beiZählung 0 automatisch eine Größenänderung bis zum Ende der Zeichenkette vorgenommen.
Nach der Logik sollte es auch in StringToShortArray funktionieren.
Die Fehlermeldung wäre ohne Größenanpassung besser ausgefallen.
 
Roman:
Natürlich ist das genial. In der Hilfe wird nicht explizit auf die Behandlung vonCount 0 hingewiesen.
Aber wenn man den Kopf dreht, ist die Übergabe einer Array-Größe von Null und die Zuweisung von Null-Speicher für dieses Array gelinde gesagt seltsam.
Deshalb wird bei Zählung 0 automatisch eine Größenänderung bis zum Ende der Zeichenkette vorgenommen.
Nach der Logik sollte es auch in StringToShortArray funktionieren.
Sie sollten besser einen Fehler ohne Größenänderung zurückgeben.

Und in

CharArrayToString

Warum nicht gleich bis zum Ende?

void OnStart()
{
    const uchar array[] = { 'A', 'B', 'C' };
    const int start = 0, count = 0;
    Print(CharArrayToString( array, start, count ));
}

Ergebnis: ""

 
A100:

Und in

Warum nicht gleich bis zum Ende?

Ergebnis: ""

Wahrscheinlich, weil es inCharArrayToString kein dynamisches Array [out] gibt.
Und der Entwickler entschied, dass dies unnötig sei.
Obwohl unterschiedliche Logik in ähnlichen Funktionen mehr Verwirrung stiftet.