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!
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.
das geht leider nicht. ich muss den speicher über memcpy auslesen, d.h. an der adressierung kann ich hier nichts ändern.
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?
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.
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!
Bernd schrieb: > memcpy (dest_buffer, xmem_pointer + xy.name, 3) Wie geht das nochmal??? - so irgendwie doch xmem_pointer + (&((_xy *)0)->name)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.