Forum: PC-Programmierung Kopie eines void *buffer


von Heinz (Gast)


Lesenswert?

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

von Lord Z. (lordziu)


Lesenswert?

void *memcpy( void *to, const void *from, size_t count );


Die Länge von deinem Puffer wirst du ja kennen, oder?

von Heinz (Gast)


Lesenswert?

die Länge kenne ich ja.

Besten Dank werde es gleich mal probieren.

bis gleich

von Heinz (Gast)


Lesenswert?

ach noch was vergessen. Wie muß ich den neuen Pointer anlegen?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Heinz (Gast)


Lesenswert?

ich möchte den Inhalt kopieren. Das Problem die Kopie muß zu einem 
Zeitpunkt gemacht werden zu diesem der Typ nicht klar ist.

von Heinz (Gast)


Lesenswert?

ich habe es jetzt so umgebaut das ich den Typ weiss. Und nu?

von Klaus W. (mfgkw)


Lesenswert?

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...

von Lord Z. (lordziu)


Lesenswert?

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.

von Lord Z. (lordziu)


Lesenswert?

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.

von Heinz (Gast)


Lesenswert?

richtig einen Bereich.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Lord Z. (lordziu)


Lesenswert?

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.

von Heinz (Gast)


Lesenswert?

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.

von Lord Z. (lordziu)


Lesenswert?

Immernoch memcpy. Den void Pointer auf den kopierten Puffer kannst du 
dann auf deinen neuen Typ casten. Siehe mein Beispiel weiter oben.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Lord Z. (lordziu)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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
Noch kein Account? Hier anmelden.