Discusión sobre el artículo "Cómo deshacerse del lastre de las DLL caseras" - página 4

 
Maxim Kuznetsov #:

el último parámetro (que es cnt) también es de 64 bits. Es size_t

https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy

Gracias.

 
Maxim Kuznetsov #:

claro que si...los prototipos son de 4 (32 bit address a la unsigned int), y se compila/ejecuta en 5 (tiene 64).

Retarded, yo antes escribía vía longs.

#define  MEMCPY_MACROS(A)                                                     \
long memcpy( const long Destination, const A &Source[], const uint Length ); \
long memcpy( A &Destination[], const long Source, const uint Length );
 
Edgar Akhmadeev #:

Me perdí el punto con la dirección de 64 bits. Pero sigo fallando con la dirección corregida. ¿Es seguro que debería funcionar? ¿Puedo ver un ejemplo completo del código fxsaber corregido?

Hasta ahora sigo siendo de mi propia opinión - la dirección de WinAPI es incompatible con MQL.

He encontrado un error, por qué la versión corregida no funcionó para mí. Hice un error tipográfico, se perdió & en un lugar.

Mi opinión ha cambiado, gracias a todos.

 

Por cierto, MS considera la función memcpy insegura y obsoleta y sugiere memcpy_s en su lugar. Además, el primer parámetro no es const. Así que el resultado es:

#define  DEF_MEMCPY_S(T)                                                   \
        ulong memcpy_s(T &dst,   ulong size, const ulong src, ulong cnt); \
        ulong memcpy_s(T &dst[], ulong size, const ulong src, ulong cnt); \
        ulong memcpy_s(T &dst,   ulong size, const T &src[],  ulong cnt); \
        ulong memcpy_s(T &dst[], ulong size, const T &src[],  ulong cnt);
        
#import "msvcrt.dll"
        DEF_MEMCPY_S(char)
        DEF_MEMCPY_S(uchar)
        DEF_MEMCPY_S(int)
        DEF_MEMCPY_S(uint)
        DEF_MEMCPY_S(long)
        DEF_MEMCPY_S(ulong)
#import



void OnStart() {
        int Array[];
        ArrayResize(Array, 1);
        Array[0] = 123;
        int Value1 = 0;
        int Value2 = 0;
        
        ulong Address = memcpy(Array, 0, 0);
        memcpy_s(Value1, sizeof(int), Address, sizeof(int));
        
        memcpy_s(Value2, sizeof(int), Array,   sizeof(int));
        
        Print(Value1, " ", Value2);
}
 

Ejemplos interesantes. Una pregunta para los entendidos. ¿Es posible obtener la dirección de un vector, matriz, objeto de cualquier clase?

 
Denis Kirichenko #:

Ejemplos interesantes. Una pregunta para los entendidos. ¿Es posible obtener la dirección de un vector, matriz, objeto de cualquier clase?

no