Fehler, Irrtümer, Fragen - Seite 3011

 
A100:

Da der 4. Parameter

Ich muss die ersten 3 Zeichen kopieren. Wenn ich die gesamte Zeichenfolge (7 Zeichen einschließlich der Endung 0) kopieren wollte, würde ich -1 angeben. Und wenn ein Teil davon nicht kopiert werden kann, wozu brauche ich dann diesen Parameter?

Dieser Parameter gibt nicht an, wie viele Zeichen kopiert werden sollen, wie der
Substring, sondern wie viele Zeichen an das Array übergeben werden.
d.h. es ist eine C-ähnliche strenge Sicherheitsüberprüfung der Größe der übergebenen Daten.
Mit dieser Größe wird automatisch Speicher für das dynamische Array zugewiesen.

Wenn Sie drei Elemente aus einer Zeichenkette kopieren wollen, müssen Sie sie zuerst aus der Zeichenkette holen,
, und sie dann übergeben, wobei Sie die Größe so viel wie möglich angeben müssen.

 
Roman:

Dieser Parameter gibt nicht an, wie viele Zeichen kopiert werden sollen, wie der Substring
, sondern wie viele Zeichen an das Array übergeben werden.
d.h. es handelt sich um eine strenge Sicherheitsprüfung der Größe der übergebenen Daten in C-Größe.
Mit dieser Größe wird automatisch Speicher für das dynamische Array zugewiesen.

Wenn Sie drei Elemente aus einer Zeichenkette kopieren müssen, müssen Sie sie zuerst aus der Zeichenkette holen,
, und dann müssen Sie sie übergeben, wobei Sie die Größe bei der Übergabe angeben.

Sie meinen so?

StringToCharArray(InputText,scr,0,StringLen(InputText));
 
Vitaly Muzichenko:

Ich meine, richtig?

Plus eins als Größe der abschließenden Null.
StringLen gibt die Größe ohne die Null zurück.

char ch[];
string InputText = "ABCDEF";
int    size      =  StringLen(InputText)+1;
    
StringToCharArray( InputText, ch, 0, size);
Print(GetLastError()); //0
 
Roman:

Plus eins als Größe der abschließenden Null.
StringLen gibt die Größe ohne Berücksichtigung von Null zurück.

Ich habe ein Beispiel von den Entwicklern gegeben und es funktioniert

Forum für Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: Bibliothek mit Hash-Funktionen und Konvertierungen

Ilyas, 2021.03.04 15:12

Die Funktion StringToArray fängt die Terminierung Null ein, wenn die Länge der Zeichenkette nicht angegeben ist (historisch)

Daher sollten Sie in der Funktion CryptDecodeA

StringToCharArray(InputText,scr,0,StringLen(InputText));

anstelle von

StringToCharArray(InputText,scr);

 
Vitaly Muzichenko:

Ich habe ein Beispiel von den Entwicklern gegeben und es funktioniert.


Die Verwendung von Bibliotheken war in dieser Frage nicht vorgesehen ))
Das sind die Feinheiten von Bibliotheken.

 
Roman:

Plus eins als Größe der abschließenden Null.
StringLen gibt die Größe ohne Berücksichtigung von Null zurück.

Ist StringToCharArray so unfähig, die Zeichenkettenlänge aus einer Zeichenkette abzurufen (vor allem, da Sie nicht brauchen, um es in MQL zu berechnen), dass externe Hilfe in Form eines zusätzlichen Parameters erforderlich ist? Und warum haben andere MQL-Funktionen keine so vermeintlich strenge"C-Prüfung"?

 
A100:

Ist StringToCharArray so unfähig, Stringlänge von String-Typ zu extrahieren (zumal es nicht in MQL berechnet werden muss), dass externe Hilfe in Form eines zusätzlichen Parameters erforderlich ist? Und warum haben andere MQL-Funktionen keine solch angeblich strenge Prüfung?

Diese Frage richtet sich wahrscheinlich nicht an mich, sondern an die Entwickler.
Dieser Parameter wird jedoch für die Zuweisung der Speichergröße für ein dynamisches Array verwendet.
Mit anderen Worten, es ist eine bequeme Möglichkeit, die Zuweisung von Speicher für das Array selbst zu vermeiden.
Außerdem können wir die Korrektheit überprüfen.
Der zusätzliche Größenparameter ist ein Standardverfahren für die strenge Sicherheit in sys.
Bei anderen Funktionen, bei denen die Größe nicht erforderlich ist, fehlt dieser Parameter.
Normalerweise wird dieser Parameter bei der Arbeit mit Arrays verwendet, um Speicher zuzuweisen.
Dies ist in diesem Fall der Fall.

 
Roman:

Diese Frage richtet sich wahrscheinlich nicht an mich, sondern an die Entwickler.
Dieser Parameter wird jedoch verwendet, um Speicher für ein dynamisches Array zuzuweisen.
Das bedeutet, dass Sie den Speicher des Arrays nicht selbst zuweisen müssen.
Außerdem wird die Richtigkeit der Angaben überprüft.

Und worin besteht die Prüfung auf Korrektheit? - Nehmen wir an, ich hätte zum Beispiel 0 geschrieben - ein absichtlich falscher Wert.

void OnStart()
{
    uchar ch[];
    const string text = "ABCDEF";
    Print( StringToCharArray( text, ch, 0, 0 ));
}

Und alles wird korrekt kopiert und das Ergebnis: 7 - kein Fehler

 
A100:

Wie wird die Korrektheit überprüft? - Nehmen wir also an, ich setze ihn auf 0, was bekanntermaßen ein falscher Wert ist.

Und alles wird korrekt kopiert. Ergebnis: 7 - kein Fehler

Der Trick liegt in der Funktionsbeschreibung ))

count=-1

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

automatischer Fortschritt ))
, was den Benutzer noch mehr verwirrt.

 
Roman:

Mit diesem Parameter geben Sie nicht an, wie viele Zeichen Sie als Sub-String kopieren wollen
, sondern wie viele Zeichen an das Array übergeben werden.

help ist mit dieser Auslegung nicht einverstanden.

Die Anzahl der zu kopierenden Array-Elemente. Bestimmt die Länge der Ergebniszeichenkette. Die Voreinstellung ist -1, was bedeutet, dass bis zum Ende des Arrays oder der Klemme 0 kopiert wird. Die Klemme 0 wird auch in das Zielarray kopiert, und die Größe des dynamischen Arrays kann bei Bedarf erhöht werden, um der Stringgröße zu entsprechen. Wenn die Größe des dynamischen Arrays größer ist als die Länge der Zeichenkette, wird die Größe des Arrays nicht verringert.

Die Beschreibung ist natürlich atas - String wird als Array bezeichnet, Array als String, Verwirrung

Anzahl der zu kopierenden Array-(String-)Elemente. Gibt die Länge der resultierenden Zeichenkette (Array) an. Der Standardwert ist -1, was bedeutet, dass bis zum Ende des Arrays (der Zeichenkette) kopiert wird, oder dass der Terminal 0 ist.