Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Structure füllen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.10.2009, 11:30 Uhr
~Punk_A
Gast


wie kann ich eine structure mit bytes füllen wenn die stuctur zb:

C++:
  typedef struct _mystruct
{
  WORD value1
  DWORD value2
  WORD value3

} mystruct,*PM_mystruct;


und ich ab byte offset 0h alles was eben dann bis zum word value3 ist einfüllem
alsso *(PUCHAR) Buffer abwärts 8 bytes in die structur dass dann
von adresse *(PUCHAR) Buffer bis *(PUCHAR) Buffer+1 diese 2 beytes als word in value1 stehen?
und dann 4 bytes also buffer+2 bis buffer +6 in value 2 und der rest in value 3 stehen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.10.2009, 11:44 Uhr
ao

(Operator)


Grundsätzlich geht das mit memcpy.

Du musst aber beachten, dass der Compiler zwischen den einzelnen Struktur-Membern Lücken lassen darf, wenn dadurch die Codeerzeugung einfacher wird. Sprich, du kannst dich nicht darauf verlassen, dass die drei Values im Speicher unmittelbar aneinandergrenzen.

Und tu bitte der Gemeinschaft den Gefallen, deine Fragen lesbarer zu formulieren. Klare und vollständige Sätze mit Satzzeichen und Großschreibung an den richtigen Stellen, das wär toll.

Dieser Post wurde am 02.10.2009 um 11:44 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.10.2009, 13:36 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von ao:

Du musst aber beachten, dass der Compiler zwischen den einzelnen Struktur-Membern Lücken lassen darf, wenn dadurch die Codeerzeugung einfacher wird. Sprich, du kannst dich nicht darauf verlassen, dass die drei Values im Speicher unmittelbar aneinandergrenzen.


Bist du dir da sicher? Weil ein struct mit memcpy zu initialisieren ist eigentlich etwas übliches das man in vielen Programmen sieht und dann würden die ja alle nicht funktionieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.10.2009, 15:36 Uhr
ao

(Operator)



Zitat:
Bist du dir da sicher?


Ja, bin ich. Praktisch alle Compiler machen so was, z.B. hier:


C++:
typedef struct _foo
{
    char c;    // auf Integer-Grenze
                // alignment gap: 3 Bytes (bei 32-Bit-CPU)
    int i;      // auf der nächsten Integer-Grenze
} foo;


Will man es anders (z.B. um TCP/IP-Headerstrukturen nachzuprogrammieren), dann gibts dazu Compiler-Optionen oder #pragma pack()-Statements oder irgendwas Ähnliches. Sollte man aber nur in solchen begründeten Fällen einsetzen, weil der entstehende Code grottig und imperformant sein kann.


Zitat:
Weil ein struct mit memcpy zu initialisieren ist eigentlich etwas übliches


Der "übliche" Weg ist eher so:


C++:
struct foo bar = { 1, 2, 3 };  // Initialisierung
struct foo anotherbar;
anotherbar = foo;            // Zuweisung / Kopieren


und dabei berücksichtigt der Compiler das Alignment natürlich. Die memcpy-Variante


C++:
memcpy (&anotherbar, &bar, sizeof (struct foo));


funktioniert deshalb, weil sizeof (struct foo) die tatsächliche Größe der Struktur im Speicher ist (Alignment-Gaps mitgezählt) und nicht nur die Summe der Member-Größen.

"Wildes" Kopieren (d.h. wenn bar und anotherbar nicht denselben Typ haben) ist Schweinkram. Kann klappen, kann aber auch böse ins Auge gehen.

Dieser Post wurde am 02.10.2009 um 15:38 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.10.2009, 16:06 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von ao:

Zitat:
Bist du dir da sicher?


funktioniert deshalb, weil sizeof (struct foo) die tatsächliche Größe der Struktur im Speicher ist (Alignment-Gaps mitgezählt) und nicht nur die Summe der Member-Größen.


Ah ok, ich hatte allerdings auch noch einen Denke(Lese) Fehler drin und gedacht das dann dazwischen andere Variablen liegen könntne, aber das hast du ja nicht gesagt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.10.2009, 16:07 Uhr
0xdeadbeef
Gott
(Operator)


Was man gelegentlich findet, ist das Füllen von Structs aus Binärdateien, zumindest, wenn das Programm nur auf einer Plattform laufen muss (also das Layout des Structs gleich ist). Das ist auch völlig unproblematisch, denn neben den Werten werden ja nur unbenutzte Speicherteile mit unbenutzten Daten gefüllt - daran stört sich keiner, wenn er nicht gerade sehr dreckige Hacks betreibt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: