Forum: Compiler & IDEs Volatile Struct, Member nicht volatile


von Daniel G. (motello)


Lesenswert?

Hallo,

ich habe folgende Deklaration eines Structs:
1
struct RxPd_typ {
2
3
    /* -1: not fragmented; >=0: fragment offset */
4
    short fragment_offset;
5
6
    /* 0: not processed; 1 = processed */
7
    short processed;
8
9
    short ip_checksum;
10
    short udp_checksum;
11
    unsigned char * dataptr;
12
    short header_length;
13
    short udp_length;
14
    short ip_length;
15
    unsigned char command;
16
};
und zusätzlich:
1
extern volatile struct RxPd_typ RxPd[1024];

Definition ist in einer .c Datei:
1
volatile struct RxPd_typ RxPd[1024];

Schreibe ich nun folgende Variable:
1
volatile unsigned char *ptr;

auf
1
RxPd[x].dataptr = ptr;

Meckert der Compiler, dass das volatile verworfen wird. Wenn ich dataptr 
im struct nochmal extra mit volatile kennzeichne, gehts. Wieso wird 
volatile nicht auf alle members angewandt? Wenn ich mich nicht völlig 
blind war, hab ich es genauso gemacht, wie es u.a. hier in einem anderen 
forenbeitrag beschrieben wurde.

grüße
daniel

von (prx) A. K. (prx)


Lesenswert?

Ein pointer to volatile (volatile int *p) ist nicht das gleiche wie ein 
volatile pointer (int *volatile p).

von Daniel G. (motello)


Lesenswert?

A. K. schrieb:
> Ein pointer to volatile (volatile int *p) ist nicht das gleiche wie ein
> volatile pointer (int *volatile p).

das weiß ich, aber ich habe nirgends einen volatile pointer. mit "Wenn 
ich dataptr im struct nochmal extra mit volatile kennzeichne" meine ich 
folgendes:
1
struct RxPd_typ {
2
3
    /* -1: not fragmented; >=0: fragment offset */
4
    short fragment_offset;
5
6
    /* 0: not processed; 1 = processed */
7
    short processed;
8
9
    short ip_checksum;
10
    short udp_checksum;
11
    volatile unsigned char * dataptr;
12
    short header_length;
13
    short udp_length;
14
    short ip_length;
15
    unsigned char command;
16
};

in diesem Fall meckert der compiler nicht.

von Simon K. (simon) Benutzerseite


Lesenswert?

Daniel G. schrieb:
> A. K. schrieb:
>> Ein pointer to volatile (volatile int *p) ist nicht das gleiche wie ein
>> volatile pointer (int *volatile p).
>
> das weiß ich, aber ich habe nirgends einen volatile pointer.

DOCH! Und zwar genau dann, wenn du das Struct volatile machst ist auch 
der Pointer volatile. Aber nicht das, worauf er zeigt.

von Daniel G. (motello)


Lesenswert?

aaaaaachso... na das muss man erstmal wissen! vielen dank!

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.