Bibliotecas: Mapeado de Ficheros sin la DLL - página 5

 
baramantan:

No soy un mega programador. ¿Pero no entiendo dónde está la universalidad? uchar no puede ser universal porque limita al usuario, a saber: uchar es solo para valores positivos. El valor mínimo es cero, el valor máximo es 255.

Cualquier dato más allá del valor de uchar se hace igual al valor máximo o mínimo de uchar.

En base a lo dicho, pregunté desde el principio "cómo pasar int o double". No te entiendo, jefe.

OK. Hagamos un pequeño recorrido.

1. Tomemos el ejemplo de char y uchar. Ambas variables tienen un tamaño de 1 byte.

Esto significa que al asignar una a la otra no perdemos bytes y por tanto no perdemos el valor del dato original.

mira estas expresiones

uchar u=200; char c=u; u=c; Print(u);
c=-100; u=c; c=u; Print(c);

Lo mismo ocurre con long/ulong, int/uint.

Es decir, variables de tipo entero del mismo tamaño en bytes pueden pasarse unas a otras sin perder bytes de información.

Por cierto, esto significa que aunque el Asesor Experto acepte números MAGIC en tipo ulong, siempre puedes establecerlos y leerlos en long, es decir, en el formato con signo, en tus programas


2. ahora mira <some_type> y uchar.
Por ejemplo int. Como usted sabe de sizeof(int) tiene un tamaño de 4 bytes. Esto significa que estos 4 bytes en la memoria puede ser fácilmente representado como uchar[4] array
si hay un doble (es de 8 bytes), puede ser representado como uchar[8] array
Esto también se aplica a los bytes de cadenas - en MQL es ushort array.
bien y en consecuencia si usted tiene una estructura de cualquier tipo, puede proporcionar fácilmente cualquier dato como uchar array.

Son estos conceptos básicos sobre bytes que se utilizan en la versión MQL5 - archivos virtuales en memoria CFastFile. Almacena cualquier dato en la memoria uchar array.

Es decir, si no necesitas intercambiar datos con programas externos. O recibe datos de otro programa en forma de un flujo de datos - por ejemplo, la lectura de páginas de Internet, y estos datos no es necesario guardar todo en el disco, entonces es mejor utilizar CFastFile en lugar de la asignación de Windows.

Y por último, para consolidar completamente https://www.mql5.com/es/articles/364.

 
BoraBo:

MT5 642 Win7 64 no funciona, según tengo entendido, después de

hmem=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,size+HEAD_MEM,path); // crear objeto de memoria

Me da error 1400,

pero en Vista 32 funciona.


es debido a los diferentes tamaños de puntero en 32 y 64 sistemas

este archivo de libreria esta hecho para una terminal de 32 bits.

pero si usas un terminal de 64 bits, debes poner tipo long de 8 bytes en todos los lugares donde se implique un puntero (por ejemplo PBYTE, LPVOID, etc., y en todos los tipos memcpy).

 

pero como me conecto

#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 

Da

'GetLastError' - ambiguous call to overloaded function with the same parameters SymbolInfo.mqh  718     10
'GetLastError' - ambiguous call to overloaded function with the same parameters	SymbolInfo.mqh	725	57

y estos dos inludes funcionan uno sin el otro.

 
olyakish:

pero como me conecto

Da

y estas dos inclusiones funcionan una sin la otra.

intente utilizar la resolución de contexto ::
 
sergeev:
intente utilizar la resolución contextual ::

Gracias

Sólo tuve que modificar la biblioteca estándar.

//+------------------------------------------------------------------+
bool CSymbolInfo::CheckMarketWatch(void)
  {
//--- comprobar si el símbolo está seleccionado en el MarketWatch
   if(!Select())
     {
      if(::GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL)
        {
         printf(__FUNCTION__+": Unknown symbol '%s'",m_name);
         return(false);
        }
      if(!Select(true))
        {
         printf(__FUNCTION__+": Error adding symbol %d",::GetLastError());
         return(false);
        }
     }
//--- tener éxito
   return(true);
  }
//+------------------------------------------------------------------+
No creo que eso sea bueno....
 
olyakish:

Gracias.

Sólo tuve que modificar la biblioteca estándar.

No creo que eso sea bueno.

No lo entiendes.

Te hablé de kernel32::GetLastError. Mira cómo está implementado en mi código.

Si no te satisface esta opción, entonces declara import from kernel32 GetLastError por ejemplo con parámetro int. no habrá diferencia al llamarlo, pero evitarás conflictos.

 
sergeev:

no lo entiendes.

Te he hablado de kernel32::GetLastError, mira como está implementado en mi código.

Si esta opción no te conviene, entonces declara import from kernel32 GetLastError por ejemplo con parámetro int. no habrá diferencia al llamarlo, pero evitarás conflicto.

Tal vez no lo estoy diciendo correctamente.

pero tenemos que

porque aquí tienes un ejemplo de tu código con la librería estándar adjunta.

//+------------------------------------------------------------------+
//|MemMap
//| Copyright © 2006-2013, FINEXWARE Technologies GmbH ||
//| www.FINEXWARE.com
//| Programación y desarrollo - Alexey Sergeev, Boris Gershanov
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006-2013, FINEXWARE Technologies GmbH"
#property link      "www.FINEXWARE.com"
#property version   "1.00"
#include <MemMapLib.mqh>
#include <Trade\Trade.mqh> 


//------------------------------------------------------------------ OnStart
void OnStart()
{
        CMemMapFile hmem;
        long err=hmem.Open("Local\\test",111,modeCreate);
        
        uchar data[];
        StringToCharArray("Hello from MQL5!",data);
        err=hmem.Write(data,ArraySize(data));
        
        ArrayInitialize(data,0);
        hmem.Seek(0,SEEK_SET);
        err=hmem.Read(data,ArraySize(data));
        Print(CharArrayToString(data));
        
        hmem.Close();
}

Al compilar da los mismos errores.

 

olyakish, vuelve a leer atentamente lo que te he escrito.

Si no te satisface el contexto, te digo exactamente lo que quiero decir.

  • "o que cambiar para tu biblioteca".
 
sergeev:

no lo entiendes.

Te he hablado de kernel32::GetLastError, mira como está implementado en mi código.

Si esta opción no te conviene, entonces declara import from kernel32 GetLastError por ejemplo con parámetro int. no habrá diferencia al llamarlo, pero evitarás conflictos.

Al llamar a kernel32::GetLastError con su contexto en el código , el compilador llamará a GetLastError sin contexto.

Los programadores sólo tienen que hacer una regla para llamar MQL-análogos de las funciones WinAPI estándar con el contexto. Entonces no habrá problemas con la modificación posterior.

Y así arreglas la biblia estándar y se actualizará, por lo que tienes que editarla de nuevo.

 
Urain:

Y así arreglas el bíblico estándar y se actualizará, de nuevo tienes que editarlo.

La estándar es la estándar, así que no hay nada que hacer ahí, no hay manera. Hay un error - informe a los desarrolladores. No hay otra manera.