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.

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.