mikrocontroller.net

Forum: Compiler & IDEs Einfacher Zugriff auf ein Array mit einer Hilfsstruktur


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bekomme ein Telegramm als char-Array. In diesem Telegramm sind 
Anfragen mit einer bestimmten Struktur die z.B. so aussieht:
typedef struct {
    unsigned char type;
    unsigned char number;
    int length;
    int code;
} item_t;

Mein Telegramm ist ein Array z.B. so:
unsigned char telegram[512];

Wie setze ich ein Item z.B. Index 100 des Arrays, um dann über item.type 
auf diesen Wert einfacher zugreifen zu können?
Kann man das überhaupt so machen, also bezüglich alignment in 
Strukturen? Nicht dass das auf einer anderen Architektur nicht mehr 
funktioniert.

Autor: Spinner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guckst Du hier: Beitrag "Re: Variablen an bestimmten Adressen deklarieren"

Denk an pragma pack.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
über eine union geht das auf jeden Fall... vlt. nicht gerade der 100 
Eintrag...
union test {
   struct item_t test1;
   unsigned char telegramm[512];
}

Die beiden Elemente der Union liegen an der selben Speicherstelle...

Daher ist test.telegram[0] == test.test1.type

Sonst halt über Pointer drauf zu greifen...

Autor: B e r n d W. (smiley46)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef struct {
    unsigned char type;
    unsigned char number;
    int length;
    int code;
}item_t;

unsigned char telegram[512];

struct item_t *my_item; // structure Zeiger definieren
my_item = (struct *item_t)&telegram[17];
my_item->type = ...

Vorteil:
die Structure kann an einer beliebigen Stelle des Arrays anfangen, falls 
z.B. in einem Empfangsbuffer erst der Anfang gefunden werden muss.

Nachteil:
Der Zeiger benötigt 2 Bytes.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich müsste das gehen:
item_t * p;

p = (item_t *) (telegram +100);
Damit erhältst du einen Zeiger vom Typ item_t, der an die entsprechende 
Stelle zeigt. mit p->type, p->number etc. kannst du dann auf die 
Komponenten zugreifen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Infos.

Ein sizeof() meiner Beispielstruktur von oben gibt ohne #pragma pack 12 
Bytes, mit pack 10 Bytes zurück. Also immer noch zu groß.

Ich habe jetzt die inttypes genommen, also:
#include <inttypes.h>

#pragma pack (1)
typedef struct {
    uint8_t type;
    uint8_t number;
    uint16_t length;
    uint16_t code;
} item_t;
#pragma pack (1)
Damit komme ich auf die gewünschten 6 Bytes.
Sollte dann doch auf jedem Prozessor funktionsfähig zu übersetzen sein.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die zweite Klammer beim pack muss natürlich leer sein:
#pragma pack (1)
typedef struct {
    uint8_t type;
    uint8_t number;
    uint16_t length;
    uint16_t code;
} item_t;
#pragma pack ()

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.