La nouvelle syntaxe MQL4 - page 4

 
Correct, à moins qu'il y ait une très bonne raison, seuls bool, int, double et string sont dans mon code. Je ne m'embêterais pas avec -1 dans les index, sinon j'aurais besoin de caster tous les entiers qui se rapprochent de cet index.
 
RaptorUK:

uchar - Unsigned Character (caractère non signé), pourquoi l'utiliser pour une boucle ? cela n'a aucun sens pour moi... utilisez un int. Vous allez travailler avec des ulongs, c'est ce qu'est une nouvelle datetime... et si vous tapez sans y penser à l'avenir, vous serez averti... faites avec ou ignorez l'avertissement. Ne vous contentez pas d'espérer le meilleur, faites comme vous le faites maintenant, apprenez et comprenez.

Ce que vous avez posté sur stackoverflow me paraît logique, je pense que c'est un bon conseil.

uchar était juste un exemple car ma question était liée à l'utilisation de petits types de variables. uchar est une valeur positive de 8 bits de 0 à 255, donc pour une boucle de 0 à 100, vous pourriez utiliser uchar 8 bits au lieu d'un entier 32 bits, si vous le vouliez.
 
SDC:
uchar n'était qu'un exemple car ma question concernait l'utilisation de petits types de variables. uchar est une valeur positive de 1 octet de 0 à 255, donc pour une boucle de 0 à 100, vous pourriez utiliser le 1 octet uchar.
Oui, vous pourriez... mais pourquoi le feriez-vous ? Cela fonctionnera mais pourquoi est-il logique d'utiliser un type de variable destiné à des valeurs de caractères pour un compteur de boucle ?

Si vous avez besoin de sauvegarder une valeur renvoyée par une fonction et que la fonction en question renvoie un uchar, alors utilisez une variable uchar pour sauvegarder la valeur renvoyée... avec la mql4 originale, ce n'était pas un problème, ce sera plus un problème avec la nouvelle mql4.
 

Quand j'ai posé la question, je ne savais pas pourquoi je voudrais le faire, c'est pourquoi j'ai posé la question lol...

Je ne savais pas si un type de variable de 8 bits serait traité plus rapidement qu'un 32 bits ou s'il serait plus lent ou juste pareil, je ne savais pas si une valeur de 8 bits utiliserait moins de RAM ou moins d'espace disque. vu que nous avons maintenant ces petits types de variables à notre disposition, j'étais juste intéressé de connaître les avantages et les inconvénients de les utiliser quand ils correspondent aux exigences du bloc de code, par rapport au fait de s'en tenir aux entiers de 32 bits sur toute la ligne.

Je pensais que peut-être un système d'exploitation 32 bits pouvait traiter quatre valeurs 8 bits en même temps, mais je ne le savais pas. Apparemment non. Cela explique pourquoi un système d'exploitation 64 bits n'est pas vraiment plus rapide qu'un système 32 bits, à l'exception du fait qu'il peut accéder à plus de RAM. Je me suis souvent posé cette question.

 

J'ai une question, pour laquelle je n'ai pas trouvé de solution.

Comment utiliser void&? Je veux dire, si j'ai besoin d'envoyer un pointeur à une DLL. Dans le fichier d'aide, il y a des fonctions qui utilisent ce type void, mais si je le place n'importe où dans la source, il ne compile pas. J'ai essayé d'utiliser un modèle comme solution de rechange, mais les modèles sont interdits dans l'instruction #import.

J'ai géré la construction pour les types simples, mais je ne suis pas en mesure de passer un pointeur de tableau void& à la DLL, à moins de spécifier le type explicite.

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
);
 
 

Y a-t-il une limitation pour passer un tableau de structures à une DLL ?

Supposons que MT4Structure soit une structure simple.

Ayant importé la dll kernel32.dll, une seule structure fonctionne très bien :

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

mais je n'arrive pas à faire fonctionner l'acceptation d'un tableau de structures. Le compilateur ne compile pas avec MT4Structure&[] si elle est envoyée comme paramètre à cette déclaration :

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

Y a-t-il une limitation pour passer un tableau de structures à une DLL ?

Je ne vois pas de problème avec quelque chose comme ça :

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

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

Cela fonctionne comme prévu (à condition que vous autorisiez différents alignements de structures par défaut dans MT4 et dans la DLL).

(BTW, je ne suis pas vraiment sûr de la représentation interne d'un bool MQL4 maintenant, mais je préfère déclarer les fonctions Win32 comme retournant des int. Les fonctions Win32 renvoient un BOOL plutôt qu'un bool C++. Un BOOL est une macro Windows pour un entier de 4 octets, dont la valeur est 1/0, alors qu'un bool C++ est un seul octet. Si vous dites à MT4 de s'attendre à un seul octet de valeur de retour des fonctions alors qu'elles renvoient en réalité quatre octets, vous pourriez - bien que ce soit très improbable - vous retrouver avec une corruption de la pile).

 
Ovo:

Comment utiliser void&? Je veux dire, si j'ai besoin d'envoyer un pointeur à une DLL.

Je ne suis pas tout à fait sûr de la nature de votre question. Par exemple, la documentation de l'API Win32 utilise void* pour signifier "ceci accepte tout type de pointeur vers n'importe quoi ; la fonction Win32 ne se soucie pas de votre bloc de mémoire".

 
gchrmt4:

Je ne suis pas tout à fait sûr de la nature de votre question. Par exemple, la documentation de l'API Win32 utilise void* pour signifier "ceci accepte tout type de pointeur vers n'importe quoi ; la fonction Win32 ne se soucie pas de votre bloc de mémoire".


Exactement. Mais il semble que ce ne soit pas tout à fait possible avec le MQL4, et l'utilisation d'un modèle n'est pas autorisée dans le bloc #import. Ainsi, l'utilisation d'une structure supplémentaire avec winapi se traduit par une mise à jour manuelle des déclarations #import à chaque fois qu'un nouveau type est nécessaire. Ce qui est plutôt désagréable pour moi, puisque mon intention était de gérer les importations en un seul endroit.
 
Ovo:

Exactement. Mais il semble que ce ne soit pas tout à fait possible avec le MQL4, et l'utilisation d'un modèle n'est pas autorisée dans le bloc #import. Ainsi, l'utilisation d'une structure supplémentaire avec winapi se traduit par une mise à jour manuelle des déclarations #import à chaque fois qu'un nouveau type est nécessaire. Ce qui est plutôt désagréable pour moi.
Je ne suis toujours pas sûr de comprendre mais... Je ne pense pas que vous puissiez déclarer l'import MQL4 comme void*. Vous devez utiliser un type de données spécifique dans l'importation, et vous ne pouvez ensuite utiliser l'importation DLL qu'avec ce type de données. Si vous voulez utiliser la même fonction DLL avec différents types de données, alors vous avez un problème, à moins qu'il n'existe une solution de contournement comme https://www.mql5.com/en/forum/148934.