Diskussion zum Artikel "MQL5 beherrschen, vom Anfänger zum Profi (Teil II): Grundlegende Datentypen und die Verwendung von Variablen" - Seite 2

 
Oleh Fedorov #:

Ähem... Es ist mir peinlich zu fragen, aber ich muss....

  • Wie oft kommen solche Konstrukte in echtem MQL5-Code vor?
  • "Interview im Juni"... Bedeutet das, dass Sie persönlich große Unternehmen kennengelernt haben, zu deren Haupttätigkeitsbereichen MQL gehört? (Persönlich habe ich das bisher nicht erlebt).
  • Und wird dieser Code in allen C-ähnlichen Sprachen die gleichen Ergebnisse liefern?

Kurz gesagt, warum braucht ein Neuling ein so tiefes Verständnis von Literalen?


P.S. Ich persönlich bin, obwohl ich kein Neuling bin, durch Ihren Test durchgefallen, ohne eine einzige Frage richtig zu beantworten. Etwas Ähnliches ist mir in Lehrbüchern begegnet - entweder in Java oder in PHP - aber das ist schon so lange her, und es entspricht nicht dem praktischen Code, den ich bis jetzt lesen oder schreiben musste... Ich werde kein Junkie in deinem Büro sein. Und... was?

P.P.S. Ich denke, wenn Du einen Artikel über Literale schreibst, könnte er nicht nur für mich nützlich sein. ;-) Vor allem, wenn Du Deine Erfahrungen mitteilst, die nicht in der Hilfe.... stehen. Wie auch immer, undokumentierte Funktionen sind mir normalerweise sehr peinlich, weil sie sich zu oft in neuen Versionen ändern, aber man weiß ja nie.... Vielleicht wird es ja wirklich wichtig oder zumindest nützlich sein?

Sie sehen. Die Frage ist nicht, wie oft es passiert, sondern dass die Leute die Feinheiten nicht kennen und nicht kennen wollen. Und was das Einbringen von Typen angeht, so muss man das wissen, weil es die Grundlage für die Basics ist. Man bekommt dadurch so viele Schmerzen. Übrigens geht es in diesem Code nicht um die Typkonvertierung, sondern darum, dass Sie darüber nachdenken:

enum E{
   int a;
   float b;
}

double F(E& e, int a){
   e.a = a;
   return e.b;
}

Nach der Hilfe zu urteilen, ist hier also alles in Ordnung. Nur, für mich persönlich gibt es eine Nuance. Laut den Angaben der Entwickler ist mql in C++ geschrieben, und in C++ kann man das nicht machen, es ist UB, aber in C ist alles legal. Ich habe solchen Code schon oft auf Plus gesehen, und ja, er funktionierte und funktioniert, aber ich persönlich habe irgendwie Angst, so zu schreiben, aber ob die mql-Entwickler auch Angst haben, weiß ich nicht. Deshalb werde ich das nie in mql machen, weil ich die Implementierung nicht kenne.

 
Vladimir Simakov #:


Den Angaben der Entwickler zufolge ist mql in C++ geschrieben, und in C++ kann man das nicht tun, es ist UB, aber in C ist alles legal.

Es tut mir leid, aber die Entwickler behaupten, dass die MQL-Programmiersprache so nah wie möglich an C++ ist und nicht in C++ geschrieben wurde. ))

Mit freundlichen Grüßen, Vladimir.

 
Vladimir Simakov #:
Und über die Typumwandlung müssen Sie Bescheid wissen, denn sie ist die Grundlage der Grundlagen.

Und ich werde nicht einmal versuchen, darüber zu streiten. Ich stimme dir vollkommen zu. Es ist nur so... Nun, nicht alle C-Konstrukte sind in MQL gleich nützlich! :-)

Bezüglich des Codes "zum Nachdenken"... Da ich mich mit C nicht auskenne (mit beiden), sieht dieser Code für mich wie ein Spiel aus. In der Hilfe wird der Enum-Typ auf Integer-Typen verwiesen, und ich habe nicht einmal gedacht, dass es sich um eine Struktur handelt. Seine Bedeutung ist ganz anders... Aber danke, jetzt weiß ich es - auch wenn es mir persönlich nichts nützt, ich werde es gar nicht benutzen :-).

Also, nach der Hilfe zu urteilen, ist hier alles normal.

Kann ich einen Link haben?

Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
Документация по MQL5: Основы языка / Типы данных / Целые типы / Перечисления
  • www.mql5.com
Данные перечислимого типа enum относятся к некоторому ограниченному множеству данных. Определение перечислимого типа: Список значений представляет...
 
Oleh Fedorov #:

Bezüglich des Codes "zum Nachdenken"... Da ich mich mit C nicht auskenne (mit beiden), sieht dieser Code für mich wie ein Spiel aus. In der Hilfe wird der Enum-Typ auf Integer-Typen bezogen, und ich dachte nicht einmal, dass es sich um eine Struktur handelt. Seine Bedeutung ist ganz anders... Aber danke, jetzt weiß ich Bescheid - obwohl es mir persönlich nichts nützt, werde ich so etwas nicht verwenden :-).

Das ist das Spiel. Jemand muss von der Decke geschrieben haben und enum und union verwechselt haben. Sein Beispiel ist nicht kompilierbar. Enum ist keine Struktur, sondern eine 4-Byte-Ganzzahl. Wenn Sie union nehmen, funktioniert es perfekt in C++ und MQL.

PS. Was das erste Beispiel aus Juns Interview und die Frage, wie oft es vorkommt, betrifft - natürlich kommt es nicht in reiner Form vor, weil das Beispiel verfeinert ist, aber sehr oft werden vorzeichenbehaftete und vorzeichenlose Ganzzahlen in Code gemischt verwendet, und hier sind Probleme recht wahrscheinlich.
 
Stanislav Korotky #:

Das ist Unsinn. Die Person muss von der Decke geschrieben haben und enum und union verwechselt haben. Sein Beispiel ist nicht kompilierbar. Enum ist keine Struktur, sondern eine 4-Byte-Ganzzahl. Wenn Sie union nehmen, funktioniert das in C++ und MQL einwandfrei.

PS. Was das erste Beispiel aus Juns Interview und die Frage, wie oft es vorkommt, betrifft - natürlich kommt es in seiner reinen Form nicht vor, weil das Beispiel verfeinert ist, aber sehr oft werden vorzeichenbehaftete und vorzeichenlose Ganzzahlen in Code gemischt verwendet, und hier sind Probleme recht wahrscheinlich.

Natürlich union)))))

Über den Rest: https: //en.cppreference.com/w/cpp/language/union

It is undefined behavior to read from the member of the union that wasn't most recently written. 

Und ja, ich weiß, was da als nächstes steht

Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union.

Außer, dass msvs, aus dessen Hilfe es entnommen ist, das zweite nicht behauptet, obwohl noch niemand darauf gestoßen ist. g++ und clang haben nicht nachgeschaut, was sie darüber sagen, aber es ist kaum anders.

Wenn Sie es auf diese Weise verwenden wollen, dann tun Sie es - es ist Ihr Recht und Ihr Schmerz, wenn etwas passiert))).

 
Vladimir Simakov #:

Natürlich))))

Über den Rest: https: //en.cppreference.com/w/cpp/language/union

cppreference ist eine nützliche Ressource, aber aufgrund ihres Referenzcharakters kann sie nicht alle Nuancen enthalten, die nur in Sprachspezifikationen zu finden sind. Um sie zu verallgemeinern, ist es einfacher, einen Blick auf Stackoverflow zu werfen. Zusammenfassend lässt sich sagen, dass bei primitiven Typen die bitweise "Übertragung" von Werten beim Lesen eines Feldes gewährleistet ist, selbst wenn nicht in das Feld geschrieben wurde.

Accessing inactive union member and undefined behavior?
Accessing inactive union member and undefined behavior?
  • 2012.07.07
  • Luchian Grigore Luchian Grigore 257k 66 66 gold badges 461 461 silver badges 626 626 bronze badges
  • stackoverflow.com
I was under the impression that accessing a member other than the last one set is UB, but I can't seem to find a solid reference (other than answers claiming it's UB but without any support from the standard). So, is it undefined behavior?
 
Stanislav Korotky #:

Das ist Unsinn. Die Person muss von der Decke geschrieben haben und enum und union verwechselt haben. Sein Beispiel ist nicht kompilierbar. Enum ist keine Struktur, sondern eine 4-Byte-Ganzzahl. Wenn Sie union nehmen, funktioniert das in C++ und MQL einwandfrei.

PS. Zum ersten Beispiel aus Juns Interview und der Frage, wie oft es vorkommt - natürlich kommt es nicht in Reinform vor, weil das Beispiel verfeinert ist, aber sehr oft werden vorzeichenbehaftete und vorzeichenlose Ganzzahlen in Code gemischt verwendet, und da sind Probleme durchaus wahrscheinlich.

Puh, das Weltbild ist wiederhergestellt! :-) Ich bin gerade dabei, Unions und andere komplexe Typen fertigzustellen (hoffentlich, wenn es keine weiteren Patzer gibt, sollte es nächste Woche erscheinen).

P.S. MetaEditor hebt Literale mit den Suffixen `u` und `ull` nicht hervor, sondern kompiliert sie. Gleichzeitig hebt er `f` hervor, meldet aber einen Fehler.... Ich frage mich, ob dies ein Fehler oder ein Hinweis ist? :-)

 

Wenn Sie als Anfänger durch unsere Debatte verwirrt sind, lassen Sie mich erklären, dass Sie in C (und auch in C++) Suffixe an numerische Literale anhängen können, die den Datentyp ändern. Zum Beispiel verwandelt das Suffix "u" eine gewöhnliche Ganzzahl(int) in eine Ganzzahl ohne Vorzeichen(uint).

Versuchen Sie, ein leicht modifiziertes Skript auszuführen, das von Vladimir Simakov vorgeschlagen wurde (achten Sie auf das Fehlen von Leerzeichen zwischen Zahlen und Buchstaben, das ist wichtig):

void OnStart()
  {
//---
    
   Print(typename(1));
   Print(typename(-1));
   Print(typename(1 ll));
   
   Print(typename(1 u));
   Print(typename(1 ull));
   
   Print(typename(-1*1 ull));
   
   Print(typename(NULL));
   
   
   Print(-1<1 u); 
   Print(-1*1 ull);
  }

Dieses Skript gibt in den ersten Zeilen die Typnamen einiger Literale aus, die in MQL5 kompiliert sind.

Es kann sein, dass ich nicht alle funktionierenden Suffixe kompiliert habe, ich hoffe, C-Spezialisten werden mich korrigieren. Versuchen Sie einfach, die Logik zu verstehen - basierend auf dem Material des Artikels, der Skriptausgabe und unserer Diskussion, und wenn alles nicht klar ist - stellen Sie Fragen.

Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
Обсуждение статьи "Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных"
  • 2024.06.11
  • Vladimir Simakov
  • www.mql5.com
Опубликована статья Изучение MQL5 — от новичка до профи (Часть II): Базовые типы данных и использование переменных : Автор: Oleh Fedorov...