Forum: Compiler & IDEs Indirekte Speicheradressierung über struct


von Bernd (Gast)


Lesenswert?

Hallo allerseits,

ich hab folgende Struktur:

typedef struct xy {
   unsigned char alter;
   unsigned int crc;
   unsigned char name[30];
   unsigned char vorname[20];
} _xy;


Die Daten liegen alle in einem externen EEProm gespeichert und ich muss 
eine Suche implementieren.

Gibt es unter C eine Möglichkeit, den Speicherbereich, den ich ja über 
einen Pointer adressiere, irgendwie über die definierten Elemente im 
Struct abzubilden ?

Beispiel, wenn ich nur die ersten 3 Buchstaben von Name lesen möchte, 
würd
ich jetzt folgendes schreiben:

memcpy (dest_buffer, xmem_pointer+3, 3);

ich würde dort jedoch irgendwie diese notation nutzen wollen, damit ich 
später beim erweitern/verändern des structs nicht sämtliche stellen im 
code anfassen muss:

memcpy (dest_buffer, xmem_pointer + xy.name, 3)

Aber leider spuckt mit der gcc dort nur einen fehler aus. gibt es 
überhaupt eine notation, die mir das ermöglicht ?

Vielen Dank schonmal!

von Floh (Gast)


Lesenswert?

Bernd schrieb:
> typedef struct xy {
>    unsigned char alter;
>    unsigned int crc;
>    unsigned char name[30];
>    unsigned char vorname[20];
> } _xy;

dann kannste dir nen Pointer anlegen:

xy* pointxy = NULL;

dann zuweisen:

pointxy = &_xy;

über das Zugreifen:

pointxy->alter = 12;
pointxy->name = "dsad";

so greifste auf Elemente einer Struktur zu, wenn die Startadresse im 
Pointer steht.

von Bernd (Gast)


Lesenswert?

das geht leider nicht.

ich muss den speicher über memcpy auslesen, d.h. an der adressierung 
kann ich hier nichts ändern.

von Floh (Gast)


Lesenswert?

Bernd schrieb:
> memcpy (dest_buffer, xmem_pointer+3, 3);

Problematisch ist da halt, dass dem Compiler freigestellt ist, wie er 
die Struct intern organisiert (kann man aber glaub ich irgendwie 
deaktivieren -nopacked?).

Wie wärs, den Datensatz als Char-Array aufzubauen, in dem die Angaben 
fest vorgegebene Positionen haben?

von Mbwe (Gast)


Lesenswert?

Du meinst: Du willst nicht.

von Hc Z. (mizch)


Lesenswert?

Bernd schrieb:
> memcpy (dest_buffer, xmem_pointer+3, 3);
1
_xy *xmem_pointer;
2
.. (u.a. Zuweisung an xmem_pointer) ..
3
memcpy (dest_buffer, &xmem_pointer->name, 3);

Es ist übrigens keine gute Idee, eine Benutzerstruktur „_xy“ zu nennen. 
Solche Symbole (beginnend mit „_“) sind für Compiler- und 
Runtime-Library-Bauer reserviert.

von Bernd (Gast)


Lesenswert?

ich nehme alles zurück. mit der idee von floh klappts.

typedef struct xy {
   unsigned char alter;
   unsigned int crc;
   unsigned char name[30];
   unsigned char vorname[20];
} _xy;


_xy *point;

point = xmem_pointer;

memcpy (dest_buffer, point->name, 3)

@Zimmerer: jo, ist klar. ist jetzt aber auch nur pseudo-code. 
genaugenommen müsste ich jetzt noch die typenkonvertierungen angeben, 
damit der compiler nicht meckert.

ich bin nur der meinung, dass ich irgendwann mal zu meinen "turbo 
pascal" zeiten das ganze unter pascal so machen konnte, wie ich es oben 
aufgeführt hab.

aber ist jetzt egal, vielen vielen dank nochmal an alle!

von Mano (Gast)


Lesenswert?

Bernd schrieb:
> memcpy (dest_buffer, xmem_pointer + xy.name, 3)

Wie geht das nochmal??? - so irgendwie doch

xmem_pointer + (&((_xy *)0)->name)

von Karl H. (kbuchegg)


Lesenswert?

Mano schrieb:
> Bernd schrieb:
>> memcpy (dest_buffer, xmem_pointer + xy.name, 3)
>
> Wie geht das nochmal??? - so irgendwie doch
>
> xmem_pointer + (&((_xy *)0)->name)


Wenn schon, dann benutzte bitte das offsetof Makro aus stddef.h


   memcpy( dest_buffer, xmem_pointer + offsetof( _xy, name ), 3 );

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.