mikrocontroller.net

Forum: PC-Programmierung Kopie eines void *buffer


Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void *memcpy( void *to, const void *from, size_t count );


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

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Länge kenne ich ja.

Besten Dank werde es gleich mal probieren.

bis gleich

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach noch was vergessen. Wie muß ich den neuen Pointer anlegen?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du schreibst, du willst den Zeiger kopieren, das ist nicht schwer:
    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.

Autor: Heinz (Gast)
Datum:

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

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe es jetzt so umgebaut das ich den Typ weiss. Und nu?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  const int myLength = 11;
  char myString[myLength] = { "Hello Welt" };

  void* firstPtr = myString;
  void *myMemory = malloc(myLength);

  printf("First: %s\n\r", (char*)firstPtr);

  memcpy(myMemory, firstPtr, myLength);

  printf("First: %s\n\r", (char*)firstPtr);
  printf("Memory: %s\n\r", (char*)myMemory);

  free(myMemory);

  return 0;
}

Wichtig ist halt, dass irgendwo ein Puffer mit genügend Speicher bereit 
liegt.

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
richtig einen Bereich.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lord Ziu (lordziu)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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/

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.