Fragen von einem "Dummy" - Seite 14

 

Und noch etwas, worüber Sie nachdenken sollten: Tun Sie es!// Berichten Sie die Ergebnisse. ;)

struct s_char8
  {
   char c[8];
  };
struct s_long
  {
   long l;
  };
void OnStart()
  {
    Print("//------ ");
    
    s_long L;
    L.l = 2387159478511726799;

    s_char8 Ch = L;

    string S = CharArrayToString(Ch.c, 0);
    
    Print(S);
   }
 
MetaDriver:

Ich bin ehrlich gesagt verblüfft, Leute. Ihr macht einfach auf gleicher Augenhöhe rum. Auf keinen Fall.

Ich wollte mich nur entschuldigen und mich in dieses "ernste" Gespräch einmischen. Aber als ich unterwegs war, um Zigaretten zu holen, wurde ich überrumpelt.

Und es ist ja nicht so, dass wir "Dummköpfe" sind, oder? Und dieses "Boo-Boo-Boo" wurde aus dem Nichts geschaffen.

In der Klasse CExpert korrigiere ich es zu ulong.

 
Renat:

Sie irren sich.

Ja, ich habe die Typenumwandlung vergessen.

 
uncleVic:

Und es handelt sich nicht um "Dummies", oder?

Ich bin in vielerlei Hinsicht ein Dummkopf. Ich verstehe also nicht, wie Funktionen, die long zurückgeben sollen, ULONG_MAX-1 zurückgeben können. Die Fallstricke einer oberflächlichen Handhabung von Integer-Typen werden fast im Handbuch selbst beschrieben. sergeev hat den Grund für die Frage richtig erfasst: Auftragskontrolle. Wenn ich request.magic auf den Typ ulong einstelle, dann erwarte ich, dass die Funktionen HistoryDealGetInteger(), PositionGetInteger() und OrderGetInteger() ebenfalls den Typ ulong zurückgeben. Ohne explizit-implizite Typkonvertierungen.

Wennseine Beispiele jedoch erklären, dass Konvertierungen vom Typ long<->ulong keinen Werteverlust verursachen (im Gegensatz zu double -> int, zum Beispiel), dann wird der weitere Gedankengang klar.

OnkelVic:

Und ein solches "Boo-Boo-Boo" wurde auf einem leeren Platz geschaffen.

Der Thread "Dummies Fragen" wurde gewählt, um Erklärungen zu erhalten, nicht um ermahnt zu werden.

 
Yedelkin:

Ich bin ein Dummkopf für viele Dinge. Ich verstehe also nicht, wie Funktionen, die long zurückgeben sollen, ULONG_MAX-1 zurückgeben können. Die Fallstricke einer oberflächlichen Handhabung von Integer-Typen werden fast im Handbuch selbst beschrieben. sergeev hat den Grund für die Frage richtig erfasst: Auftragskontrolle. Wenn ich request.magic als ulong festlege, dann erwarte ich, dass die Funktionen HistoryDealGetInteger(), PositionGetInteger() und OrderGetInteger() ebenfalls den Typ ulong zurückgeben. Ohne explizit-implizite Typkonvertierungen.

Wennseine Beispiele jedoch erklären, dass Konvertierungen vom Typ long<->ulong keinen Werteverlust verursachen (anders als z.B. double -> int), dann wird der weitere Gedankengang klar.

Der Thread "Dummies Fragen" wurde eigentlich zur Aufklärung und nicht zur Ermahnung gewählt.

Beleidigt? Tut mir leid, ich konnte es nicht lassen.
 
uncleVic:
Sind Sie beleidigt? Tut mir leid, ich konnte es nicht lassen.
Nein, bin ich nicht. Ich hatte schon einige Internet-Schlachten. Ich versuche nur immer, die Diskussion sozusagen in eine konstruktive Richtung zu lenken.
 
sergeev:

Tatsächlich sind es nicht 64, sondern nur 63 Bits (d. h. unvollständige 8 Bytes). 8 Bytes wären es, wenn der gesamte lange Bereich genutzt würde.

Aber leider...

Zum einen wird ein magischer Ulong in die MqlTradeRequest-Struktur übergeben. Das bedeutet, dass nur positive Werte eingestellt werden können.

Die Funktionen PositionGetInteger/OrderGetInteger hingegen geben den Typ Long zurück . Das bedeutet, dass die Hälfte des Bereichs ulong abgeschnitten ist.

Es handelt sich also um 63 Bits statt der oben beschriebenen 64 Bits. Eigentlich ist es nicht so sehr schlimm, als dass es den Grundsätzen der Auftragskontrolle große Unannehmlichkeiten bereitet .

Es wäre viel bequemer, das gleiche System wie in MT4 zu verwenden - magische Zeichen zuzulassen. Da viele Handelssysteme auf einem einfachen Prinzip beruhen, bei dem das Symbol eines Magiers verwendet wird. Da es viel einfacher ist, ein System in zwei zu unterteilen und Ihre Aufträge mit der üblichen Funktion MathAbs( OrderMagicNumber() ) herauszufiltern.

alle 64. Das ist in der Tat so. Klammern Sie sich nicht an signierte oder unsignierte Typen. Dies dient dazu, dass der Compiler sicherstellt, dass die arithmetischen Operationen korrekt sind (und es gibt eine bitweise Rechtsverschiebung, entweder logisch oder arithmetisch, je nach Vorzeichentyp).

Bei der Übertragung (Zuweisung) und vorzeichenlosen Übertragung von Daten gleicher Größe gehen keine Informationen verloren. Versuchen Sie, ULONG_MAX hin und her zu schieben. Versuchen Sie Longulong-Auftrag und zurück. Versuchen Sie, die Struktur zu kopieren.

Am besten, Sie überzeugen sich selbst davon. Dann wird die Frage ein für alle Mal geklärt sein.

 
MetaDriver:

Und noch etwas, woran Sie denken sollten: Tun Sie es!// Berichten Sie die Ergebnisse. ;)

Erledigt! Ersetzen Sie Zeile 14 des Codes durch L.l = 4548887299649496524.

Aus der Beschreibung der MqlTradeRequest-Struktur geht hervor, dass magic vom Typ ulong ist, d.h. es können ihm Werte zugewiesen werden, die größer sind als der konstante Wert LONG_MAX. Allerdings sind die Funktionen des ... DieGetInteger()-Funktionen sind für die Arbeit mit dem Long-Typ ausgelegt, so dass magische Werte von diesen Funktionen implizit in den Long-Typ umgewandelt werden. Da es jedoch eine Eins-zu-Eins-Entsprechung zwischen Variablen vom Typ long und ulong gibt, wird beim Vergleich des magischen Werts mit dem Ergebnis, das von Funktionen vom Typ ...GetInteger() -Funktionenkönnen wir sicher eine explizite Typumwandlung verwenden (zum Beispiel: magic == (ulong)OrderGetInteger(ORDER_MAGIC) ).

Danke, dass Sie immer wieder Beispiele zeigen.

 

stringo:

Bei der Datenübertragung (Zuweisung) und dem signierten und unsignierten Casting von Daten gleicher Größe gehen keine Informationen verloren. Versuchen Sie, ULONG_MAX hin und her zu schieben. Versuchen Sie Longulong-Auftrag und zurück. Versuchen Sie, die Struktur zu kopieren. Überzeugen Sie sich selbst und verbreiten Sie keine Mythen.

Ich habe es bereits ausprobiert, und es liefert das erforderliche Ergebnis, wenn man den Typ erzwingt (vielleicht muss noch ein "Tanz mit den Diamanten" zusätzlich durchgeführt werden). Aber das ist nicht so wichtig).

OnkelVic:

Ich werde die Klasse CExpert in ulong ändern.

Ich halte es für eine gute Idee, dass diejenigen, die negative Werte in der Magie verwenden, zwangsweise angeben müssen, was sie zurückgeben/setzen müssen.

Es wäre auch sehr schön, wenn in der Dokumentation nicht nur long oder ulong, sondern beide Typen angegeben würden (z.B. so "long / ulong").

 
stringo:

Bei der Datenübertragung (Zuweisung) oder bei zeichenlosen Übertragungenvon Daten gleicher Größe gehen keine Informationen verloren.

Eine weitere Frage: Gibt es eine elegante Möglichkeit, Informationen bei der Übertragung von double -> long zu erhalten?