www.mikrocontroller.net

Forum: Compiler & IDEs Indirekte Speicheradressierung über struct


Autor: Bernd (Gast)
Datum:

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

Autor: Floh (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das geht leider nicht.

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

Autor: Floh (Gast)
Datum:

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

Autor: Mbwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst: Du willst nicht.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd schrieb:
> memcpy (dest_buffer, xmem_pointer+3, 3);
_xy *xmem_pointer;
.. (u.a. Zuweisung an xmem_pointer) ..
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.

Autor: Bernd (Gast)
Datum:

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

Autor: Mano (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd schrieb:
> memcpy (dest_buffer, xmem_pointer + xy.name, 3)

Wie geht das nochmal??? - so irgendwie doch

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

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

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

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.