PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : volatile problem



Siro
27.07.2010, 16:14
ich habe eine Merkwürdigkeit mit meinem C-COMPILER von IAR
Ein void pointer ist meiner Meinung nach zu allen Typen kompatibel.
deshalb wird der folgende code auch einwandfrei compiliert.

int x;

void write(void* address)
{
}

void main(void)
{
write(&x);
}


wenn ich aber
int volatile x;
schreibe, bekomme ich vom Compiler eine Fehlermeldung:
argument of type "int volatile *" is incompatible with parameter of type "void"

wie kommt das denn ?, Ich übergebe doch nur die Adresse der Variablen.
Das "volatile" soll doch nur den Compiler vor Optimierungen zurück halten.

wenn ich dann eine explizite Typenwandlung vornehme, ist die Welt wieder in Ordnung. Dabei scheint es egal zu sein, wie ich den pointer "caste"
write((int*) &x);

ich kann auch
write((char*) &x);
schreiben.

aber wozu brauche ich denn dieses "Casting" überhaupt, wenn eine Variable volatile definiert ist ?

mfg. Siro

vielleicht kann mal jemand die paar Zeilen mit einem GNU Compiler testen, ob dort auch eine Fehlermeldung ausgegeben wird. Vielen Dank für Eure Mühe im voraus.

PicNick
27.07.2010, 17:31
ich glaub, es muss heissen
"volatile int"
vielleicht hilft das

Siro
27.07.2010, 17:35
Vorab erstmal Danke,
ich habe eben beide Varianten probiert, scheint dem Compiler egal zu sein ob volatile vor dem int oder nach dem int steht. Er meckert jedesmal.
Schade....
Hast aber in sofern recht,
im C-Buch steht auch, daß "volatile vor dem int stehen soll. Hab grad nachgesehen.

Besserwessi
27.07.2010, 18:38
Es könnte sein, dass der Compiler Pointer auf volatile Variablen anders behandelt, denn das ist durchaus sinnvoll, weil man sonst schwer zu finden Fehler bekommen kann, wenn der Zugriff über den Pointer nicht als Volatile behandelt wird. Allerdings wäre da meiner Meinung nach nur eine Warnung angebracht, denn ausnahmnsweise könnte das ja auch mal oK sein.

Es gibt auch eine Methode einen Pointer auf ein Volatiles Ojekt zu definieren. Wie genau müßte man mal nachlesen. Da kommt bei der Defintion das Volatile irgendwo mit rein.

Siro
27.07.2010, 21:36
Super, Besserwessi,
mit dem Hinweis:
"Pointer auf ein Volatiles Ojekt"
hab ich mal gegoogelt und auch verschiedenen Dinge gefunden. Als Lösung hat sich nun folgendes ergeben. Ich kann ein "volatile" auch bei dem Parameter in der der Funktion selbst angeben, dann darf ich "normale" sowie "volatile" definierte Variablen übergeben. Damit hat sich mein Problem erledigt. Man lernt doch nie aus....

vielen Dank

void write(void volatile* address)
{
}