Die neue MQL4-Syntax - Seite 4

 
Richtig, es sei denn, es gibt einen sehr guten Grund, nur bool, int, double und string sind in meinem Code. Ich würde mir nicht die Mühe machen, -1 in Indizes zu verwenden, da ich sonst jeden Integer, der näher an diesen Index herankommt, umwandeln müsste.
 
RaptorUK:

uchar - Unsigned Character, warum sollten Sie das für eine Schleife verwenden? das macht für mich keinen Sinn ... verwenden Sie einen int. Sie werden mit ulongs arbeiten, das ist, was eine neue datetime ist ... und wenn Sie typecast, ohne darüber nachzudenken in der Zukunft werden Sie gewarnt werden ... mit der Warnung umgehen oder sie ignorieren. Hoffen Sie nicht nur auf das Beste, sondern machen Sie es wie jetzt, lernen und verstehen Sie.

Das, was Sie auf Stackoverflow gepostet haben, macht für mich Sinn, ich denke, es ist ein guter Rat.

uchar war nur ein Beispiel, da sich meine Frage auf die Verwendung kleiner Variablentypen bezog. uchar ist ein positiver 8-Bit-Wert von 0 bis 255, so dass man für eine Schleife von 0 bis 100 den 8-Bit-Wert uchar anstelle einer 32-Bit-Ganzzahl verwenden könnte, wenn man wollte.
 
SDC:
uchar war nur ein Beispiel, da sich meine Frage auf die Verwendung von kleinen Variablentypen bezog. uchar ist ein positiver 1-Byte-Wert von 0 bis 255, so dass Sie für eine Schleife 0 bis 100 das 1-Byte uchar verwenden könnten.
Ja, das könnte man... aber warum sollte man? Es wird funktionieren, aber warum macht es logisch Sinn, einen Variablentyp, der für Zeichenwerte gedacht ist, für einen Schleifenzähler zu verwenden?

Wenn Sie einen von einer Funktion zurückgegebenen Wert speichern müssen und die betreffende Funktion einen uchar-Wert zurückgibt, dann verwenden Sie eine uchar-Variable, um den zurückgegebenen Wert zu speichern ... mit dem ursprünglichen mql4 war dies kein Problem, mit dem neuen mql4 wird es eher ein Problem sein.
 

Als ich die Frage stellte, wusste ich nicht, warum ich das wollte, deshalb stellte ich die Frage lol...

Ich wusste nicht, ob ein 8-Bit-Variablentyp schneller als ein 32-Bit-Variablentyp verarbeitet werden würde, oder ob er langsamer oder einfach gleich wäre, ich wusste nicht, ob ein 8-Bit-Wert weniger RAM oder weniger Festplattenplatz verbrauchen würde. Da wir jetzt diese kleinen Variablentypen zur Verfügung haben, war ich einfach daran interessiert, die Vor- und Nachteile ihrer Verwendung zu erfahren, wenn sie zu den Anforderungen des Codeblocks passen würden, im Gegensatz zum generellen Festhalten an 32-Bit-Ganzzahlen.

Ich dachte, ein 32-Bit-Betriebssystem könnte vielleicht vier 8-Bit-Werte gleichzeitig verarbeiten, aber ich wusste es nicht. Offenbar nicht. Das erklärt, warum ein 64-Bit-Betriebssystem nicht wirklich viel schneller ist als ein 32-Bit-Betriebssystem, abgesehen von der Tatsache, dass es auf mehr RAM zugreifen kann. Darüber hatte ich mich schon oft gewundert.

 

Ich habe eine Frage, für die ich keine Lösung gefunden habe.

Wie kann man void& verwenden? Ich meine, wenn ich einen Zeiger an eine DLL senden muss. In der Hilfedatei gibt es Funktionen, die diesen void-Typ verwenden, aber wenn ich ihn irgendwo in den Quellcode einfüge, lässt er sich nicht kompilieren. Ich habe versucht, Template als Workaround zu verwenden, aber Template ist innerhalb der #import-Anweisung verboten.

Ich habe die Konstruktion für einzelne Typen verwaltet, aber ich bin nicht in der Lage, die Übergabe eines void&-Array-Zeigers an die DLL zu implementieren, es sei denn, ich gebe den expliziten Typ an.

int  FileReadArray(
   int    file_handle,               // File handle
   void&  array[],                   // Array to record
   int    start=0,                   // start array position to write
   int    count=WHOLE_ARRAY          // count to read
);
 
 

Gibt es eine Einschränkung für die Übergabe eines Arrays von Strukturen an eine DLL?

Angenommen, MT4Structure ist eine einfache Struktur.

Nachdem ich die kernel32.dll importiert habe, funktioniert eine einzelne Struktur ganz gut:

bool ReadFile(
    /*_In_         HANDLE*/ int hFile,
    /*_Out_        LPVOID*/ MT4Structure& lpBuffer,
    /*_In_         DWORD*/ uint nNumberOfBytesToRead,
    /*_Out_opt_    LPDWORD*/ uint& lpNumberOfBytesRead[],
    /*_Inout_opt_  LPOVERLAPPED*/int lpOverlapped
);

Aber ich bin nicht in der Lage, ein Array von Strukturen zu akzeptieren. Der Compiler wird nicht mit MT4Structure&[] kompilieren , wenn esals Parameter an diese Deklaration gesendet wird:

bool ReadFile(int, MT4Structure&[], uint, uint&[],int);
 
Ovo:

Gibt es irgendeine Einschränkung für die Übergabe Array von Strukturen an eine DLL?

Ich kann nicht sehen, ein Problem mit so etwas wie dieses:

struct TestStruct {
   int Integer;
   uchar Byte;
   double Real;
};

#import "ExampleDllWhichReceivesStructureArray.dll"
   void Test(TestStruct &[]);
#import 

Es funktioniert wie erwartet (vorausgesetzt, dass Sie für unterschiedliche Standard-Struktur-Ausrichtung in MT4 und die DLL ermöglichen).

(BTW, ich bin mir nicht sicher, was die interne Repräsentation eines MQL4 bool ist, aber ich würde es vorziehen, Win32-Funktionen als int zu deklarieren. Win32-Funktionen geben eher ein BOOL als ein C++ bool zurück. Ein BOOL ist ein Windows-Makro für eine 4-Byte-Ganzzahl, deren Wert 1/0 ist, während ein C++ bool ein einzelnes Byte ist. Wenn Sie MT4 mitteilen, dass es ein einzelnes Byte als Rückgabewert von Funktionen erwartet, obwohl diese in Wirklichkeit vier Bytes zurückgeben, könnte es - obwohl es sehr unwahrscheinlich ist - zu einer Beschädigung des Stacks kommen).

 
Ovo:

Wie kann man void& verwenden? Ich meine, wenn ich einen Zeiger an eine DLL senden muss.

Ich bin mir nicht ganz sicher, was Ihre Frage ist. In der Dokumentation der Win32-API wird zum Beispiel void* verwendet, um zu sagen: "Dies akzeptiert jeden Typ von Zeiger auf irgendetwas; die Win32-Funktion kümmert sich nicht darum, was Ihr Speicherblock ist".

 
gchrmt4:

Ich bin mir nicht ganz sicher, was Ihre Frage ist. In der Dokumentation der Win32-API wird zum Beispiel void* verwendet, um zu sagen, dass "dies jeden Zeigertyp auf irgendetwas akzeptiert; die Win32-Funktion kümmert sich nicht darum, was Ihr Speicherblock ist".


Ganz genau. Aber es scheint, dass dies mit MQL4 nicht ganz möglich ist, und die Verwendung einer Vorlage ist innerhalb des #import-Blocks nicht erlaubt. Die Verwendung einer zusätzlichen Struktur mit winapi führt also dazu, dass die #import-Deklarationen jedes Mal manuell aktualisiert werden müssen, wenn ein neuer Typ benötigt wird. Das ist ziemlich unangenehm für mich, da meine Absicht war, die Importe an einer Stelle zu verwalten.
 
Ovo:

Exakt. Aber es scheint, es ist nicht ganz möglich mit der MQL4, und mit einer Vorlage ist nicht innerhalb #import Block erlaubt. Die Verwendung einer zusätzlichen Struktur mit winapi führt also dazu, dass die #import-Deklarationen jedes Mal manuell aktualisiert werden müssen, wenn ein neuer Typ benötigt wird. Das ist für mich ziemlich unangenehm.
Ich bin mir immer noch nicht sicher, ob ich das verstehe, aber... Ich glaube nicht, dass man den MQL4-Import als void* deklarieren kann. Sie müssen einen bestimmten Datentyp im Import verwenden, und Sie können den DLL-Import dann nur mit diesem Datentyp verwenden. Wenn Sie dieselbe DLL-Funktion mit verschiedenen Datentypen verwenden wollen, haben Sie ein Problem, es sei denn, es gibt eine Abhilfe wie https://www.mql5.com/en/forum/148934.
Grund der Beschwerde: