Discussão do artigo "Eliminação de DLLs autogeradas" - página 4

 
Maxim Kuznetsov #:

o último parâmetro (que é cnt) também é de 64 bits. Ele é size_t

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

Obrigado.

 
Maxim Kuznetsov #:

É claro que sim... os protótipos são de 4 (endereço de 32 bits a la int sem sinal), e você compila/executa em 5 (tem 64).

Retardado, eu mesmo escrevi via longs antes.

#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 #:

Não entendi o ponto com o endereço de 64 bits. Mas ainda estou tendo problemas com o endereço corrigido. Tem certeza de que deve funcionar? Posso ver um exemplo completo do código fxsaber corrigido?

Até agora, continuo com minha própria opinião - o endereço da WinAPI é incompatível com o MQL.

Encontrei um erro que explica por que a versão corrigida não funcionou para mim. Cometi um erro de digitação, perdi & em um lugar.

Minha opinião mudou, obrigado a todos vocês.

 

A propósito, a MS considera a função memcpy insegura e obsoleta e sugere memcpy_s em seu lugar. Além disso, o primeiro parâmetro não é const. Portanto, o resultado é:

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

Exemplos interessantes. Uma pergunta para os conhecedores. É possível obter o endereço de um vetor, matriz ou objeto de qualquer classe?

 
Denis Kirichenko #:

Exemplos interessantes. Pergunta para os conhecedores. É possível obter o endereço de um vetor, matriz ou objeto de qualquer classe?

não