Forum: Compiler & IDEs Auf WertE einer struct über einen pointer zugreifen.


von AVRli (Gast)


Lesenswert?

Hi,

ich habe folgende struct erstellt um übersichtlicher auf die Daten 
zugreifen zu können.

typedef struct ST_MY_STRUCT
{
  uint8_t    op;
  uint16_t  sec;
  uint32_t  id;
  uint16_t  flags;
  char    addr[6];
  char    name[16];
  char    fin[12];
} MY_STRUCT;

Weiter habe ich einen Buffer wo die Daten vom UART kommen...

char buf_uart[128];

Um die nun im Struct- Zugriff Daten im "buf_uart" zu ändern gehe ich wie 
folgt vor ...

MY_STRUCT* pMY_STRUCT = (MY_STRUCT*) buf_uart;
pMY_STRUCT->id = 0xFF12AE34;
pMY_STRUCT->op = 15;
pMY_STRUCT->sec = 600;

Die Daten stehen dann an der Position wo sie hingehören im RAM...


Nur zurück habe ich nun das Problem das die Inhalte nicht stimmen... :-(

uint32 id_read;
MY_STRUCT* pREAD_MY_STRUCT = (MY_STRUCT*) buf_uart;

id_read = pREAD_MY_STRUCT->id;

Inhalt von id_read ist anderes...


Hoffe man kann es nachvollziehen und es gibt jemanden der Ahnung hat und 
mir einen Tip geben kann. ;-)

Grüße, AVRli...

von Mark B. (markbrandis)


Lesenswert?

Ich habe id_read (welches übrigens falsch deklariert war, bei Dir steht 
uint32 anstatt uint32_t) mal einen Initialwert gegeben:

1
#include <stdint.h>
2
#include <stdio.h>
3
4
typedef struct ST_MY_STRUCT
5
{
6
  uint8_t    op;
7
  uint16_t  sec;
8
  uint32_t  id;
9
  uint16_t  flags;
10
  char    addr[6];
11
  char    name[16];
12
  char    fin[12];
13
} MY_STRUCT;
14
15
char buf_uart[128];
16
17
void buffer_write(void)
18
{
19
    MY_STRUCT* pMY_STRUCT = (MY_STRUCT*) buf_uart;
20
    pMY_STRUCT->id = 0xFF12AE34;
21
    pMY_STRUCT->op = 15;
22
    pMY_STRUCT->sec = 600;
23
}
24
25
void buffer_read(void)
26
{
27
    uint32_t id_read = 0;
28
    printf("id_read Initialwert: %x\n", id_read);
29
    
30
    MY_STRUCT* pREAD_MY_STRUCT = (MY_STRUCT*) buf_uart;
31
    id_read = pREAD_MY_STRUCT->id;
32
    
33
    printf("id_read nach Zugriff auf Struktur ueber Zeiger: %x\n", id_read);
34
}
35
36
int main()
37
{   
38
    buffer_write();
39
    buffer_read();
40
41
    return 0;
42
}

Die Ausgabe sieht so aus:

id_read Initialwert: 0
id_read nach Zugriff auf Struktur ueber Zeiger: ff12ae34

Ob das gut ist, sich Zeiger auf einen Puffer so "zurechtzubiegen", da 
kann man geteilter Meinung sein. Besser wären sauber geschriebene 
Funktionen für die Anwendungsfälle:
"Daten aus dem Puffer in die Struktur übertragen"
"Daten aus der Struktur in den Puffer übertragen"

Sauber geschriebene Funktionen benötigen in der Regel eher selten Casts.

: Bearbeitet durch User
von AVRli (Gast)


Lesenswert?

Vielen Dank für die Hinweise!

uint32_t muß es natürlich sein!

Das mit den Get/Set Routinen ist natürlich sauberer, das werde ich 
übernehmen.

Funktioniert nun wie ich es mir vorgestellt hatte. :-D Super!

Grüße AVRli...

von (prx) A. K. (prx)


Lesenswert?

Falls am anderen Ende der UART kein AVR hängt: Deine Struct kann je nach 
Prozessor ein Alignment-Loch zwischen "op" und "sec" enthalten.

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.