Diskussion zum Artikel "Den Ballast selbstgemachter "dynamischer Programmbibliotheken" loswerden" - Seite 4

 
Maxim Kuznetsov #:

der letzte Parameter (cnt) ist ebenfalls 64 Bit lang. Er ist size_t

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

Danke!

 
Maxim Kuznetsov #:

natürlich tut es ... Prototypen sind von 4 (32-Bit-Adresse a la unsigned int), und Sie kompilieren/laufen in 5 (es hat 64).

Retarded, schrieb ich über Longs früher selbst.

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

Ich habe den Punkt mit der 64bit-Adresse übersehen. Aber ich stürze immer noch mit der korrigierten Adresse ab. Ist es sicher, dass es funktionieren sollte? Kann ich ein vollständiges Beispiel für den korrigierten fxsaber-Code sehen?

Bis jetzt bin ich immer noch der Meinung, dass die Adresse von WinAPI nicht mit MQL kompatibel ist.

Ich habe einen Fehler gefunden, warum die korrigierte Version bei mir nicht funktioniert hat. Ich habe einen Tippfehler gemacht, übersehen & an einer Stelle.

Meine Meinung hat sich geändert, ich danke Ihnen allen.

 

Übrigens hält MS die Funktion memcpy für unsicher und veraltet und schlägt stattdessen memcpy_s vor. Außerdem ist der erste Parameter nicht const. Also ist das Ergebnis:

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

Interessante Beispiele. Eine Frage für Kenner. Ist es möglich, die Adresse eines Vektors, einer Matrix oder eines Objekts einer beliebigen Klasse zu erhalten?

 
Denis Kirichenko #:

Interessante Beispiele. Eine Frage für Kenner. Ist es möglich, die Adresse eines Vektors, einer Matrix oder eines Objekts einer beliebigen Klasse zu erhalten?

nein