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


von Thomas (Gast)


Lesenswert?

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.

von Spinner (Gast)


Lesenswert?

Guckst Du hier: Beitrag "Re: Variablen an bestimmten Adressen deklarieren"

Denk an pragma pack.

von ... .. (docean) Benutzerseite


Lesenswert?

ü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...

von B e r n d W. (smiley46)


Lesenswert?

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.

von Detlev T. (detlevt)


Lesenswert?

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.

von Thomas (Gast)


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:
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.

von Thomas (Gast)


Lesenswert?

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 ()

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.