Einfacher Zugriff auf ein Array mit einer Hilfsstruktur

Gast #1032752
Hallo,
ich bekomme ein Telegramm als char-Array. In diesem Telegramm sind 
Anfragen mit einer bestimmten Struktur die z.B. so aussieht:
1
typedef struct {
2
    unsigned char type;
3
    unsigned char number;
4
    int length;
5
    int code;
6
} item_t;

Mein Telegramm ist ein Array z.B. so:
1
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.
Persönliche Seite
über eine union geht das auf jeden Fall... vlt. nicht gerade der 100 
Eintrag...
1
union test {
2
   struct item_t test1;
3
   unsigned char telegramm[512];
4
}

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...
1
typedef struct {
2
    unsigned char type;
3
    unsigned char number;
4
    int length;
5
    int code;
6
}item_t;
7

8
unsigned char telegram[512];
9

10
struct item_t *my_item; // structure Zeiger definieren
11
my_item = (struct *item_t)&telegram[17];
12
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.
Eigentlich müsste das gehen:
1
item_t * p;
2

3
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.
Gast
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:
1
#include <inttypes.h>
2

3
#pragma pack (1)
4
typedef struct {
5
    uint8_t type;
6
    uint8_t number;
7
    uint16_t length;
8
    uint16_t code;
9
} item_t;
10
#pragma pack (1)
Damit komme ich auf die gewünschten 6 Bytes.
Sollte dann doch auf jedem Prozessor funktionsfähig zu übersetzen sein.
Gast
Die zweite Klammer beim pack muss natürlich leer sein:
1
#pragma pack (1)
2
typedef struct {
3
    uint8_t type;
4
    uint8_t number;
5
    uint16_t length;
6
    uint16_t code;
7
} item_t;
8
#pragma pack ()

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.