La nouvelle syntaxe MQL4 - page 5

 
gchrmt4:
Je ne suis toujours pas sûr d'avoir compris 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.


En fait, j'utilise une solution de contournement, mais elle est assez faible - envelopper n'importe quel type dans une structure générique. L'acceptation d'une structure générique en tant que paramètre peut changer dans toute version future. Cela ne fonctionne pas avec les tableaux, cependant.

 
Ovo:


En fait, j'utilise une solution de contournement, mais elle est assez faible : envelopper n'importe quel type dans une structure générique. L'acceptation d'une structure générique en tant que paramètre peut changer dans toute version future. Cela ne fonctionne pas avec les tableaux, cependant.

... Il semble que je me trompe. Ce que nous oublions tous les deux, c'est que MQL4 a maintenant la surcharge de fonction, et donc il est possible de faire quelque chose comme ça :

#import "AnyDll.dll"
   void Test(TestStruct &[]);
   void Test(int &[]);
#import 
 
gchrmt4:

... Il semble que je me trompe. Ce que nous oublions tous les deux, c'est que MQL4 a maintenant la surcharge de fonctions, et donc il est possible de faire quelque chose comme ça :


Bien sûr, c'est ce dont je parle depuis le début :)

Jusqu'à présent, mon importation ressemble à :

bool ReadFile(int, MT4Structure&, uint, uint&[],int); // wrapper for all simple types / structures
bool ReadFile(int, double&[], uint, uint&[],int);
bool ReadFile(int, int&[], uint, uint&[],int);
bool ReadFile(int, uchar&[], uint, uint&[],int);
bool ReadFile(int, MT4Structure&[], uint, uint&[],int); // this does not work

et je me demande quelle sera la longueur de cette liste (pour une seule importation) dans un an...

 

J'ai également remarqué une petite incohérence dans la compilation du code avec dépendance sur les fichiers inclus.

Si deux ou plusieurs projets partagent le même include, et que le fichier include est modifié, le premier projet le détecte et recompile, alors que les projets suivants ne le font pas. Ce n'est pas un problème grave (nous pouvons supprimer tous les ex4 à tout moment).

 

J'ai besoin d'une réponse rapide, je suis trop fatigué pour la chercher aujourd'hui. Est-il possible de détruire scope2 avant qu'il n'atteigne la limite du bloc ? Je ne le pense pas, mais il vaut mieux demander.

{
   MT4Scope* scope = new MT4Scope(_Symbol, 222);
   MT4Scope scope2(_Symbol, 223);
   delete scope; // calls destructor
   // here I want to call scope2 destructor, but I do not know how

   // some additional code
}
 
Ovo: J'ai besoin d'une réponse rapide, je suis trop fatigué pour la chercher aujourd'hui. Est-il possible de détruire scope2 avant qu'il n'atteigne la limite du bloc ? Je ne le pense pas, mais il vaut mieux demander.
Non.
 
ubzen:
Non.


Merci.
 

Pourquoi "ArrayMaximum" est différent entre MT4 600+ et MT5 ? Je pensais que la raison de la migration de la syntaxe MT4 vers la syntaxe MT5 était de faciliter le développement d'applications fonctionnant sur les deux ?


MT4

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           count=WHOLE_ARRAY,   // number of checked elements
   int           start=0              // index to start checking with
   );


MT5

int  ArrayMaximum(
   const void&   array[],             // array for search
   int           start=0,             // index to start checking with
   int           count=WHOLE_ARRAY    // number of checked elements
   );
 
dlewisfl:

Pourquoi "ArrayMaximum" est différent entre MT4 600+ et MT5 ? Je pensais que la raison de la migration de la syntaxe MT4 vers la syntaxe MT5 était de faciliter le développement d'applications fonctionnant sur les deux ?

Probablement pour essayer de maintenir une certaine rétrocompatibilité....
 
dlewisfl: Pourquoi "ArrayMaximum" est différent entre MT4 600+ et MT5 ? Je pensais que la raison de la migration de la syntaxe MT4 vers la syntaxe MT5 était de faciliter le développement d'applications fonctionnant sur les deux ?
Pas bon. Alors faites votre propre application :
int iArrayMaximum(const void& array[], int iLimit=WHOLE_ARRAY, int iBeg=0){
   if(iLimit == WHOLE_ARRAY) iLimit = ArraySize(array);
#ifdef __MQL4__
   return( ArrayMaximum(array, iLimit - iBeg + 1, iBeg) );
#else
   return( ArrayMaximum(array, iBeg, iLimit - iBeg + 1) );
#endif
}
Problème résolu.