Bei einer konstanten Zeichenkette wird mehr Speicher zugewiesen als benötigt (ihre Länge kann im Prinzip nicht erhöht werden).
Für eine nicht konstante Zeichenkette wird kein zusätzlicher Speicher zugewiesen (wenn sich ihre Länge erhöht, ist eine neue Speicherzuweisung erforderlich).
Wenn der Benutzer eine Zeichenkette mit StringInitInit initialisiert, wird mehr Speicher als nötig zugewiesen, da die Puffergröße explizit vom Benutzer festgelegt wird und in den meisten Fällen nicht vergrößert wird (der Benutzer hat sich bereits Gedanken darüber gemacht, welchen Endpuffer er benötigt und dessen Größe explizit festgelegt)
Bei einer rein konstanten Zeichenkette ist die Größe des Puffers durch StringBufferlen=0, was bedeutet, dass die Zeichenkette konstant ist:
string s1 = "_"; // исходное "чистое" присвоение константной строки
Print(StringBufferLen(s1)); // показывает 0 верно, не должно быть 260
Die Neuzuweisung einer "vermeintlich" konstanten Zeichenkette ist keine Arbeit mit einer Konstanten, sondern die Erstellung einer dynamischen Variablen mit einer Vorbelegung von 260 Zeichen:
conststring s2 = s1; // динамическое создание переменной копированием данных из другой переменной (не константной строки)
Print(StringBufferLen(s2)); // показывает 260 верно
Bei einer rein konstanten Zeichenkette ist die Puffergröße mit StringBufferlen=0, was bedeutet, dass die Zeichenkette konstant ist:
Die Neuzuweisung einer "vermeintlich" konstanten Zeichenkette ist keine Arbeit mit einer Konstanten, sondern die Erstellung einer dynamischen Variablen mit einer Vorzuweisung von 260 Zeichen:
Denn in der aktuellen Version gibt die Funktion immer eine gültige Zeit zurück, auch wenn die Zeichenkette Unsinn enthält, und es wird das aktuelle Datum zurückgegeben, was besonders seltsam ist:
StringToTime("aaabbbccc") liefert "2019.09.05 01:00:00" Ist das normal? In dieser Implementierung ist die Funktion gesundheitsgefährdend. Daher wird eine Version mit Korrektheitsprüfungen benötigt.
Bisher müssen wir mit unserer eigenen Funktion parsen,aber das Problem ist, dass die Zeit in verschiedenen Formaten angegeben werden kann.Und ich möchte nicht wirklich all diese Formate programmieren und das Rad neu erfinden, wenn die Zeit bereits in MQL implementiert wurde.
Dies gilt im Grunde auch für andere Funktionen zur Umwandlung von Zeichenketten: StringToInteger, StringToDouble, für die ebenfalls keine Gültigkeitsprüfung vorgesehen ist.
p.s. Hmm, es stellt sich heraus, dassGetLastError() in diesen Fällen Fehler erzeugt. Das wusste ich nicht. Die Dokumentation für diese Funktionen sagt nichts dergleichen. Das beseitigt das Problem, obwohl es mit einem bool einfacher wäre.
Fehler "Eigenschaft existiert bereits mit anderem Wert und wird übersprungen".
Ich habe es zum ersten Mal benutzt. In keiner anderen Datei ist sie enthalten. Hängt nicht vom Wert ab. Build 2136.
Dieser Fehler tritt bei der Arbeit mit Projekten auf, wenn der Wert der im Quellcode angegebenen Eigenschaft nicht mit dem Wert in den Projekteinstellungen übereinstimmt.
Die Programmeigenschaften in der Projektdatei haben Vorrang vor den im Quellcode angegebenen Eigenschaften. Wenn Sie Eigenschaften sowohl im Projekt als auch im Quellcode angeben, werden die Eigenschaften aus dem Projekt verwendet.
MetaEditor позволяет удобно работать над большими проектами: объединять множество файлов в одну структуру, управлять настройками проекта и вести совместную разработку с командой программистов через версионное онлайн-хранилище MQL5 Storage. Что такое проект Проект — это отдельный файл с расширением "MQPROJ", в котором хранятся настройки...
Стилизатор позволяет быстро привести оформление исходного кода к рекомендуемому стандарту. Это делает код легко читаемым, выглядящем профессионально. Грамотно оформленный код гораздо проще читать и анализировать в последующем как его автору, так и другим пользователям. Чтобы запустить стилизатор, нажмите " Стилизатор" в меню "Сервис" или...
Die Ausführungsergebnisse zeigen, dass der Compiler entgegen der Logik handelt:
Bei einer rein konstanten Zeichenkette ist die Größe des Puffers durch StringBufferlen=0, was bedeutet, dass die Zeichenkette konstant ist:
Die Neuzuweisung einer "vermeintlich" konstanten Zeichenkette ist keine Arbeit mit einer Konstanten, sondern die Erstellung einer dynamischen Variablen mit einer Vorbelegung von 260 Zeichen:
Bei einer rein konstanten Zeichenkette ist die Puffergröße mit StringBufferlen=0, was bedeutet, dass die Zeichenkette konstant ist:
Die Neuzuweisung einer "vermeintlich" konstanten Zeichenkette ist keine Arbeit mit einer Konstanten, sondern die Erstellung einer dynamischen Variablen mit einer Vorzuweisung von 260 Zeichen:
es ist an der Zeit, Allokatoren einzuführen )))
Eine Erinnerung daran, dass es einen Fehler mit dem String-Puffer gibt:
Die Funktion aus der DLL kann alles sein.Ich schlage vor, eine erweiterte Version derStringToTime-Funktion zu MQL in der Form hinzuzufügen:
Denn in der aktuellen Version gibt die Funktion immer eine gültige Zeit zurück, auch wenn die Zeichenkette Unsinn enthält, und es wird das aktuelle Datum zurückgegeben, was besonders seltsam ist:
StringToTime("aaabbbccc") liefert "2019.09.05 01:00:00" Ist das normal? In dieser Implementierung ist die Funktion gesundheitsgefährdend. Daher wird eine Version mit Korrektheitsprüfungen benötigt.
Bisher müssen wir mit unserer eigenen Funktion parsen,aber das Problem ist, dass die Zeit in verschiedenen Formaten angegeben werden kann.Und ich möchte nicht wirklich all diese Formate programmieren und das Rad neu erfinden, wenn die Zeit bereits in MQL implementiert wurde.
Dies gilt im Grunde auch für andere Funktionen zur Umwandlung von Zeichenketten: StringToInteger, StringToDouble, für die ebenfalls keine Gültigkeitsprüfung vorgesehen ist.
p.s. Hmm, es stellt sich heraus, dassGetLastError() in diesen Fällen Fehler erzeugt. Das wusste ich nicht. Die Dokumentation für diese Funktionen sagt nichts dergleichen. Das beseitigt das Problem, obwohl es mit einem bool einfacher wäre.Ich unterstütze Alexeys Vorschlag, denn der sichere Umgang mit Zeichenketten ist der Schlüssel zur Vermeidung von versteckten Fehlern.
Fehler "Eigenschaft existiert bereits mit anderem Wert und wird übersprungen".
Ich habe es zum ersten Mal benutzt. In keiner anderen Datei ist sie enthalten. Hängt nicht vom Wert ab. Build 2136.
Bitte bringen Sie den Styler im alten Stil zurück.
Jetzt weiß ich nicht, was hier laufen soll:
Dieses Stück sah früher so aus:
Fehler "Eigenschaft existiert bereits mit anderem Wert und wird übersprungen".
Ich habe es zum ersten Mal benutzt. In keiner anderen Datei ist sie enthalten. Hängt nicht vom Wert ab. Build 2136.
Dieser Fehler tritt bei der Arbeit mit Projekten auf, wenn der Wert der im Quellcode angegebenen Eigenschaft nicht mit dem Wert in den Projekteinstellungen übereinstimmt.
Projekt-Eigenschaften
Bitte bringen Sie den Styler im alten Stil zurück.
Jetzt weiß ich nicht, was hier laufen soll:
Dieses Stück sah früher so aus:
Mehrfach verschachtelte ifs können nicht durch eine Ausrichtung gespeichert werden. Wir müssen den Code ändern, um ihn lesbar zu machen.
Mehrfach verschachtelte ifs können von keiner Ausrichtung gespeichert werden. Sie müssen den Code ändern, um ihn lesbar zu machen.
Es gibt keine Mehrfachverschachtelung - die oberste Ebene ist if, then if else.
Ich frage nach dem alten Stil, als alles andere so aussah:
- stand in einer einzigen Zeile und der nachfolgende Text war nicht nach rechts versetzt.
Hier ist ein Beispiel aus der Hilfezur bedingten if-else-Anweisung (der alte Styler)
und das ist es, was der neue Styler tut: