Wie kopiere ich void *p_buf wenn ich den Typ nicht weiss. Ich möchte eine Sicherheitskopie anlegen und später den Inhalt der Sicherheitskopie notfalls verwenden. Danke
void *memcpy( void *to, const void *from, size_t count ); Die Länge von deinem Puffer wirst du ja kennen, oder?
die Länge kenne ich ja. Besten Dank werde es gleich mal probieren. bis gleich
Du schreibst, du willst den Zeiger kopieren, das ist nicht schwer:
1 | void *meine_Kopie_von_p_buf = p_buf; |
Ich vermute aber, du willst das kopieren, worauf er zeigt. Das geht nicht, ohne zu wissen, welchen Typ das hat, worauf er zeigt.
ich möchte den Inhalt kopieren. Das Problem die Kopie muß zu einem Zeitpunkt gemacht werden zu diesem der Typ nicht klar ist.
Dann machst du dir von dem Typ eine Variable, castest den Pointer in diesen Typ und holst dir den Inhalt:
1 | meintollertyp die_kopie = *(meintollertyp*)p_buf; |
Übrigens elementares C, falls du ein Buch in erreichbarer Nähe hast...
Heinz schrieb: > ich habe es jetzt so umgebaut das ich den Typ weiss. Und nu? Immernoch memcpy. Und mit void-Pointer geht das trotzdem. Zumindest meiner Meinung nach:
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <string.h> |
4 | |
5 | int main() |
6 | {
|
7 | const int myLength = 11; |
8 | char myString[myLength] = { "Hello Welt" }; |
9 | |
10 | void* firstPtr = myString; |
11 | void *myMemory = malloc(myLength); |
12 | |
13 | printf("First: %s\n\r", (char*)firstPtr); |
14 | |
15 | memcpy(myMemory, firstPtr, myLength); |
16 | |
17 | printf("First: %s\n\r", (char*)firstPtr); |
18 | printf("Memory: %s\n\r", (char*)myMemory); |
19 | |
20 | free(myMemory); |
21 | |
22 | return 0; |
23 | }
|
Wichtig ist halt, dass irgendwo ein Puffer mit genügend Speicher bereit liegt.
Klaus Wachtler schrieb: > Dann machst du dir von dem Typ eine Variable, castest den Pointer > in diesen Typ und holst dir den Inhalt: meintollertyp die_kopie = *(meintollertyp*)p_buf; > > Übrigens elementares C, falls du ein Buch in erreichbarer Nähe hast... Also ich glaube ja, er will einen Speicherbereich kopieren, und nicht einen einzelnen Wert.
Glauben kann man viel; solange er nichts vernünftig beschreibt bleibt es beim Glauben. Ich fürchte anhand der wenigen Info, daß es gleich noch größere Baustellen gibt.
Heinz schrieb: > richtig einen Bereich. Dann mach es mit dem memcpy. Aber Klaus hat völlig Recht. Das gehört zu den Grundlagen von C. Und du machst nicht den Eindruck, als dass du wirklich viel Ahnung davon hast.
Ich versuche es mal besser zu beschreiben. Ich habe eine Funktion die mittels eines void* pointers auf einen Buffer zeigt des Typ nicht sofort fest gestanden ist. Nun habe ich es so umgebaut das der Typ klar ist. StruktausUint8VerschiedenerVariablen. Zunächt möchte ich eine Kopie des kompletten Inhaltes machen auf diesen der Pointer zeigt, da ich anshcließend im original buffer änderungen mache. Nach einer anschließenden Überprüfung ob die Änderungen sinn machen bleibt das geschriebene oder ich muss eben den Buffer mit der Sicherheitskopier wieder zurück setzen.
Immernoch memcpy. Den void Pointer auf den kopierten Puffer kannst du dann auf deinen neuen Typ casten. Siehe mein Beispiel weiter oben.
Oder an die Funktion nicht nur den Zeiger übergeben, sondern auch die Länge. Dann kann sich die Funktion Speicher holen (wie auch immer) und darin die Kopie wie vorgeschlagen mit memcpy anlegen. Dadurch ist der Funktion der eigentliche Typ egal, und sie kann mal mit dem einen und mal mit dem anderen Typ verwendet werden. Eigentlich bin ich nur selten ein Freund von memcpy (meist hat man einen Designfehler, wenn man memcpy nehmen will), aber vielleicht macht es hier wirklich Sinn.
Klaus Wachtler schrieb: > (meist hat > man einen Designfehler, wenn man memcpy nehmen will) Wie kopierst du sonst Buffer? Gibt's da noch andere Techniken, die ähnlich effizient sind?
Wenn es wirklich ein Puffer ist, und womöglich der auch nicht ganz gefüllt ist, macht memcpy sicher Sinn. Ich weiß aber immer noch nicht, was er wirklich kopieren will. Deshalb habe ich da so meine Zweifel. Ich bezweifle sogar, daß er selber weiß, was er will :-)
Lord Ziu schrieb: > Klaus Wachtler schrieb: >> (meist hat >> man einen Designfehler, wenn man memcpy nehmen will) > > Wie kopierst du sonst Buffer? Gibt's da noch andere Techniken, die > ähnlich effizient sind? Kommt drauf an. Wenn seine Daten tatsächlich ein Array sind, dann ist memcpy schon ok. Handelt es sich um Strukturen, dann ist es meistens vernünftiger ganz einfach die Objekte umzukopieren. Die ganze Aufgabenstellung: Ich weiß nicht worauf etwas zeigt, will es aber kopieren, klingt danach, als ob der ganze Ansatz höchst unausgegoren ist. Da muss ich Klaus absolut Recht geben. Sobald void Pointer im Spiel sind (ausser für solche Dinge wie die mem... Funktionen), ist meistens Feuer am Dach. Von daher dürfte in diesem 'kleinen Problem' noch ein 'großes Problem 'lauern, welches demnächst unbedingt raus will.
das große problem sitzt wohl eher vor dem Computer und hat keine Ahnung von C. http://openbook.galileocomputing.de/c_von_a_bis_z/
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.