La nueva sintaxis de MQL4 - página 4

 
Correcto, a menos que haya una muy buena razón, sólo bool, int, double y string están en mi código. No me molestaría con -1 en los índices, de lo contrario necesitaba para lanzar cada entero que se acerca a este índice.
 
RaptorUK:

uchar - Unsigned Character, ¿por qué usar esto para un bucle? no tiene sentido para mí... usa un int. Estarás trabajando con ulongs, eso es lo que es un nuevo datetime . . . y cuando encasilles sin pensar en ello en el futuro recibirás una advertencia . . . lidia con la advertencia o ignórala. Pero no esperes lo mejor, haz lo que estás haciendo ahora, aprende y entiende

Lo que has publicado de stackoverflow me parece que tiene sentido, creo que es un buen consejo.

uchar era sólo un ejemplo ya que mi pregunta estaba relacionada con el uso de tipos de variables pequeñas. uchar es un valor positivo de 8 bits de 0 a 255 por lo que para un bucle de 0 a 100 se podría utilizar la uchar de 8 bits en lugar de un entero de 32 bits, si se quisiera.
 
SDC:
uchar era solo un ejemplo ya que mi pregunta estaba relacionada con el uso de tipos de variables pequeñas. uchar es un valor positivo de 1 byte de 0 a 255 por lo que para un bucle de 0 a 100 se podría utilizar uchar de 1 byte.
Sí, podrías... pero ¿por qué lo harías? Funcionará, pero ¿por qué tiene sentido lógico utilizar un tipo de variable destinado a valores de caracteres para un contador de bucle?

Si necesitas guardar un valor devuelto por una función y la función en cuestión devuelve una uchar entonces usa una variable uchar para guardar el valor devuelto... con el mql4 original esto no era un problema, será más un problema con el nuevo mql4.
 

Cuando hice la pregunta no sabía por qué querría hacerlo, por eso hice la pregunta...

No sabía si un tipo de variable de 8 bits se procesaría más rápido que una de 32 bits o si sería más lento o igual, no sabía si un valor de 8 bits usaría menos RAM o menos espacio en el disco. viendo que ahora tenemos esos pequeños tipos de variables disponibles, sólo estaba interesado en saber los pros y los contras de usarlos cuando se ajusten a los requisitos del bloque de código, frente a seguir con enteros de 32 bits en todo el tablero.

Pensé que tal vez un sistema operativo de 32 bits podría procesar cuatro valores de 8 bits al mismo tiempo, pero no lo sabía. Parece ser que no. Esto explica por qué un sistema operativo de 64 bits no es realmente mucho más rápido que uno de 32 bits, excepto por el hecho de que puede acceder a más memoria RAM. A menudo me lo había preguntado.

 

Tengo una pregunta para la que no he encontrado solución.

¿Cómo utilizar void&? Es decir, si necesito enviar cualquier puntero a una DLL. En el archivo de ayuda hay funciones que usan este tipo void, pero si lo pongo en cualquier parte del código fuente, no compila. Traté de usar la plantilla como una solución, pero la plantilla está prohibida dentro de la declaración #import.

He conseguido la construcción para tipos simples, pero no puedo implementar el paso de punteros void& array a la DLL, a menos que especifique el tipo explícito.

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

¿Existe alguna limitación para pasar un array de estructuras a una DLL?

Supongamos queMT4Structure es una estructura simple.

Habiendo importado el kernel32.dll, una sola estructura funciona 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
);

pero no soy capaz de conseguir en el trabajo aceptando la matriz de estructuras. El compilador no compila con MT4Structure&[] si se envía como parámetro a esta declaración:

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

¿Existe alguna limitación para pasar un array de estructuras a una DLL?

No veo ningún problema con algo así:

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

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

Funciona como se espera (siempre que se permita una alineación de estructuras diferente por defecto en MT4 y en la DLL).

(Por cierto, no estoy seguro de cuál es la representación interna de un bool en MQL4, pero prefiero declarar las funciones Win32 como si devolvieran int. Las funciones Win32 devuelven un BOOL en lugar de un bool de C++. Un BOOL es una macro de Windows para un entero de 4 bytes, cuyo valor es 1/0, mientras que un bool de C++ es un solo byte. Si usted le dice a MT4 que espere un solo byte de valor de retorno de las funciones cuando en realidad están devolviendo cuatro bytes, entonces usted podría - aunque es muy poco probable - terminar con la corrupción de la pila).

 
Ovo:

¿Cómo utilizar void&? Es decir, si necesito enviar cualquier puntero a una DLL.

No estoy muy seguro de cuál es tu pregunta. Por ejemplo, la documentación de la API Win32 utiliza void* para significar "esto acepta cualquier tipo de puntero a cualquier cosa; a la función Win32 no le importa cuál es su bloque de memoria".

 
gchrmt4:

No estoy muy seguro de cuál es tu pregunta. Por ejemplo, la documentación de la API Win32 utiliza void* para significar "esto acepta cualquier tipo de puntero a cualquier cosa; a la función Win32 no le importa cuál es su bloque de memoria".


Exactamente. Pero parece que no es posible con el MQL4, y el uso de una plantilla no está permitido dentro del bloque #import. Así que el uso de la estructura adicional con winapi se convierte en la actualización manual de las declaraciones #import cada vez que se necesita un nuevo tipo. Lo cual es bastante incómodo para mí, ya que mi intención era gestionar las importaciones en un solo lugar.
 
Ovo:

Exactamente. Pero parece que no es posible con el MQL4, y el uso de una plantilla no está permitido dentro del bloque #import. Así que el uso de la estructura adicional con winapi se convierte en la actualización manual de las declaraciones #import cada vez que se necesita un nuevo tipo. Lo cual es bastante incómodo para mí.
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 luego 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