La nueva sintaxis de MQL4 - página 5

 
gchrmt4:
Todavía no estoy seguro de entender pero... No creo que puedas declarar la importación MQL4 como void*. Tienes que usar un tipo de datos específico en la importación, y entonces sólo puedes usar la importación de la DLL con ese tipo de datos. Si quieres usar la misma función de la DLL con diferentes tipos de datos, entonces tienes un problema a menos que haya una solución como https://www.mql5.com/en/forum/148934


En realidad estoy usando una solución, pero es bastante débil - envolviendo cualquier tipo en una estructura genérica. Aceptar una estructura genérica como parámetro puede cambiar en cualquier versión futura, pero no funciona con arrays.

 
Ovo:


En realidad estoy usando una solución, pero es bastante débil - envolver cualquier tipo en una estructura genérica. La aceptación de una estructura genérica como parámetro puede cambiar en cualquier versión futura, pero no funciona con arrays.

... Parece que estoy equivocado. Lo que ambos estamos olvidando es que MQL4 ahora tiene sobrecarga de funciones, y por lo tanto es posible hacer algo como esto:

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

... Parece que estoy equivocado. Lo que ambos estamos olvidando es que MQL4 ahora tiene sobrecarga de funciones, y por lo tanto es posible hacer algo así:


Claro, de eso hablo desde el principio :)

Hasta ahora mi importación se ve así:

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

y me pregunto cómo de larga será esta lista (para una sola importación) en un año...

 

También he notado una pequeña inconsistencia en la compilación de código con dependencia de archivos incluidos.

Si dos o más proyectos comparten el mismo include, y el archivo de inclusión se modifica, el primer proyecto lo detecta y recompila, mientras que los siguientes proyectos no lo hacen. Sin embargo, no es un problema grave (podemos eliminar todos los ex4 en cualquier momento).

 

Necesito una respuesta rápida, hoy estoy demasiado cansado para buscarla. ¿Es posible destruir scope2 antes de que llegue al límite del bloque? Creo que no, pero es mejor preguntar.

{
   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: Necesito una respuesta rápida, hoy estoy demasiado cansado para buscarla. ¿Es posible destruir scope2 antes de que llegue al límite del bloque? Creo que no, pero es mejor preguntar.
No.
 
ubzen:
No.


Gracias.
 

¿Por qué el "ArrayMaximum" es diferente entre MT4 600+ y MT5? Pensé que la razón para migrar la sintaxis de MT4 a MT5 era para facilitar el desarrollo de aplicaciones que funcionaran en ambas.


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:

¿Por qué el "ArrayMaximum" es diferente entre MT4 600+ y MT5? Pensé que la razón para migrar la sintaxis de MT4 a MT5 era para facilitar el desarrollo de aplicaciones que funcionaran en ambas.

Probablemente para intentar mantener cierta compatibilidad hacia atrás....
 
dlewisfl: ¿Por qué el "ArrayMaximum" es diferente entre MT4 600+ y MT5? Pensé que la razón para migrar la sintaxis de MT4 a MT5 era para facilitar el desarrollo de aplicaciones que funcionaran en ambas.
No es bueno. Así que haz la tuya propia:
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
}
Problema resuelto.