memcpy()- nachprogrammieren
-
hallo zusammen,
stehen vor der uns derzeit nicht ganz verständlichen aufgabe die memcpy-funktion nachzuprogrammieren.
leider sind schon mehrere versuche gescheitet.einzelne werte, wie z.b. eine zahl oder wort ist nicht weiter schwer.
allerdings spiegelt dies noch nicht 100% die arbeitsweise der oben genannten funktion.
aber wie stelle ich das z.b. an wenn es mehrere wörter sind bzw. es sich um ein array handelt.über jegliche hilfe sind wir dankbar.
thx!!
-
Vielleicht bin ich falsch, aber geht sowas nicht wie
neuerbuf[i] = alterbuf[i]
?
danke für die antwort.
-
Die primitiveste Lösung ist eine Schleife:
void* my_memcpy(void* dst,const void* src,size_t count) { char *cdst=dst, *csrc=src;//Pointer-Arithmetik funktioniert nicht mit void* size_t pos; for(pos=0;pos<count;++pos) cdst[i]=csrc[i]; return dst; }
(die echte memcpy() könnte etwas besser optimiert sein, aber prinzipiell funktioniert sie genau so)
-
Wieso tut void* ptr arithmetik nicht funzen?
-
Weil void ein Typ undefinierter Größe sein tut. Damit tut der Compiler nicht wissen tun, wieviel Byte er pro Eintrag berechnen tun muss.
-
TrollToll schrieb:
Wieso tut void* ptr arithmetik nicht funzen?
Für Zeiger-Arithmetik muß der Compiler wissen, wie groß der Datentyp hinter dem Zeiger ist (ptr+1 liefert nicht die Adresse 1 Byte hinter btr, sondern 1 Element hinter ptr (das sind sizeof(*ptr) Bytes) - 'void' hat aber keine Größe.
-
Danke für die TrollToll'e beschreibung, ich weiss jetzt wie es funktionieren tut.
-
void* my_memcpy(void* restrict dst,const void* restrict src,size_t count) // <-- restrict nicht vergessen { char *cdst=dst; char const *csrc=src; //<-- const nicht vergessen size_t pos; for(pos=0;pos<count;++pos) cdst[pos]=csrc[pos]; //<-- pos nicht i return dst; }
-
rüdiger schrieb:
// <-- restrict nicht vergessen
Nur aus Neugierde - was bedeutet das? (ist mir bislang nicht über den Weg gelaufen)
//<-- const nicht vergessen
//<-- pos nicht i
OK, da hast du in beiden Punkten recht - das kommt davon, wenn man schneller tippt als denkt
-
restrict? Was heisst denn das?
-
Hallö,
bei mir kommen die folgenden Fehlermeldungen auf:
error C2440: 'initializing' : cannot convert from 'void *' to 'char *'
error C2440: 'initializing' : cannot convert from 'const void *' to 'const char *'Kann mir jemand helfen dieses Problem zu lösen?
Thx
-
Ja - benutzt einen C-Compiler (in C++ müsstest du die Parameter explizit nach (const) char* casten, damit er es schluckt).
-
CStoll schrieb:
rüdiger schrieb:
// <-- restrict nicht vergessen
Nur aus Neugierde - was bedeutet das? (ist mir bislang nicht über den Weg gelaufen)
Das bedeutet, dass der Compiler davon ausgehen kann, dass es kein Aliasing zwischen den beiden Bereichen gibt (=> der Zugriff auf die Speicherstelle exklusiv nur durch diesen Pointer erfolgen kann). Aliasing ist in C und C++ das größte Optimierungsproblem und der Grund, warum bei unvorsichtiger Programmierung OCaml oä zB besseren Code erzeugen kann.
http://www.cellperformance.com/mike_acton/2006/05/demystifying_the_restrict_keyw.html
http://www.hlrs.de/organization/tsc/services/tools/docu/kcc/UserGuide/chapter_4.html(OT: Einige C++ Compiler (GCC und KAI basierte) können restrict bereits und ich hoffe mal, dass das auch in den neuen C++-Standard kommt)
CStoll schrieb:
//<-- const nicht vergessen
//<-- pos nicht i
OK, da hast du in beiden Punkten recht - das kommt davon, wenn man schneller tippt als denkt
Das fiel mir auch nur auf, als ich restrict einfügen wollte.
-
CStoll schrieb:
Die primitiveste Lösung ist eine Schleife:
void* my_memcpy(void* dst,const void* src,size_t count) { char *cdst=dst, *csrc=src;//Pointer-Arithmetik funktioniert nicht mit void* size_t pos; for(pos=0;pos<count;++pos) cdst[i]=csrc[i]; return dst; }
(die echte memcpy() könnte etwas besser optimiert sein, aber prinzipiell funktioniert sie genau so)
man kann das ganze aber auch so mit cast lösen:
void *my_memcpy ( void *dst, const void *src, size_t count ) { size_t i; for ( i = 0; i < count; i ++ ) *((char*) dst + i) = *((char*) src + i); return dst; }
-
hi,
wow ihr seid klasse.
vielen dank.wir arbeiten derzeit mit microsoft visual c++
derzeit tun wir uns noch ziemlich schwer, die von euch vorgeschlagene funktion anzupassen.
wir wären euch super dankebar, falls einer ein kurzes komplettes beispiel posten könnte.
vielleicht hier mal der anfang.
void main (void) { char quelle[2048] = {1,2,3,4}; char ziel[2048] = "0"; // int laenge = strlen(quelle); my_memcpy(ziel, quelle); getchar(); }
vielen vielen dank für die bereits geleistete arbeit / hilfe!!
-
ok habens hinbekommen
#include <stdio.h> #include <string.h> void *my_memcpy ( void *dst, const void *src, size_t count ) { size_t i; for ( i = 0; i < count; ++i ) *((char*) dst + i) = *((char*) src + i); return dst; } void main (void) { char quelle[2048] = ""; char ziel[2048] = ""; printf("Wert:"); scanf("%s", &quelle); int laenge = strlen(quelle); my_memcpy(ziel, quelle, laenge); printf("%s", ziel); fflush(stdin); getchar(); }
danke