Hallo!
gerne würde ich statt:
sprintf(s, "abc");
folgendes schreiben, um die Warnung des Compilers zu eliminieren:
sprintf( (char *) s, "abc");
Meine Idee ist ein define dafür.(Sollte Makro heißen?)
#define sprintf(s,"abc"); sprintf((char *)s,"abc");
Sowas kann aber nicht funktionieren, weil ich nie vorher weiß,
1) wie viele Parameter ich übergebe
2) abc auch anders sein könnte
Wie kann ich nun ein dynamischeres Makro erzeugen?
Timo P schrieb:> sprintf(s, "abc");> folgendes schreiben, um die Warnung des Compilers zu eliminieren:
welche warnung, wenn man es richtig macht kommt da keine Warnung
Im Standard-Präprozessor kann man keine Variable Anzahl von Parametern
angeben.
Auch wenn es (nicht portabel) geht, wie z.B.
http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/Variadic-Macros.html#Variadic-Macros
, macht es normalerweise mehr Sinn, ordentlich zu programmieren.
Dann braucht man nicht mit dem PP irgendwelche Warnungen unterdrücken.
unterdrücken?? Das will ich ja nicht!
die Funktion erwartet von mir ein char*. Ich habe aber ein char s[38];
also muss ich einen typecast machen im Funktionsaufruf:
sprintf((char*)&s,"abc");
diesen will ich aber nicht jedes mal wenn ich sprintf nutze schreiben.
Was kann ich dagegen tun? Grundsätzlich nicht s als:
char s[38]; sondern als char * s[38]; anlegen?
Peter schrieb:> welche warnung,
Warnung: argument 1 of sprintf discards qualifiers from pointer target
type
Peter schrieb:> wenn man es richtig macht kommt da keine Warnung
Wie soll ich es denn "richtig" machen
Timo P schrieb:> die Funktion erwartet von mir ein char*. Ich habe aber ein char s[38];>> also muss ich einen typecast machen im Funktionsaufruf:>> sprintf((char*)&s,"abc");
Nein. Das musst Du nicht. Das funktioniert auch so.
Wenn Du da eine Warnung bekommst, dann bekommst Du die aus einem
anderen Grund.
Poste ein exaktes Quelltextbeispiel und die genaue Meldung des
Compilers.
Wann genau habe ich volatile nötig?
Ich weiß, dass volatile notwendig ist, wenn man die varialbe aus einem
Interrupt heraus verändern möchte. Gibt es noch weitere praktische
Anwendungen von volatile?
Timo P schrieb:> Ich weiß, dass volatile notwendig ist, wenn man die varialbe aus einem> Interrupt heraus verändern möchte.
nein, nur wenn sie im Interrupt geändert wird und in der Main genutzt
wird. Das sich bei dir um ein zeiger handelt ist auch noch die Frage ob
du den Zeiger selber änderst oder ob du das Änderst worauf der Zeiger
zeigt.
Ich würde sagen nicht mal unbedingt im Interrupt ist volatile notwendig.
Kommt aber auf den Optimizer darauf an.
Volatile ist dann notwendig, wenn sich der Wert einer Variablen ändern
kann, ohne dass Dein Programmcode dies verursacht hat. Das ist
insbesondere bei Timerregistern oder Eingangsports des Mikrocontrollers
der Fall. Da musst Du dem Compiler mitteilen, dass er hier die Zustände
immer neu einlesen muss und das Einlesen nicht wegoptimieren darf.