Gast
#593850
warning: passing argument 1 of 'putString' discards qualifiers from pointer target type danke mgiaco
|
Anzeige
|
Verstehe diese Fehlermeldung nicht
Gast
#593850
warning: passing argument 1 of 'putString' discards qualifiers from pointer target type danke mgiaco Wie ist putString definiert und was wird übergeben? So kann man Dir leider nicht helfen. Warnung: Die Übergabe von Argument 1 von "putString" verwirft Qualifizierer des Zeiger-Ziel-Typs... Jetzt klar? Auch wenn es mit Sicherheit sinnvoll gewesen wäre, den zu der Meldung gehörenden Code zu posten: Solche Warnungen gibts, wenn man einer Funktion, die einen Datentypen ohne Typqualifizierer erwartet, eine Variable übergibt, die z.B. volatile oder static ist. I.d.R. kann man diese Warnungen ignorieren.
Gast
#593867
Ja sorry vergessen stimmt.
Aufruf: putString(Item->text); Item struct
ja ich weis es ist eine const char denn ich übergebe ich mach mir aber eine kopie in putstring. danke >ja ich weis es ist eine const char denn ich übergebe ich mach mir aber >eine kopie in putstring. Genau das ist das Problem. Das const wird verworfen. Wenn Du
definierst, dürfte die Warnung weg sein. und "const" ist der Qualifier, den du verwirfst. Lösung: Statt putString(char ...) einfach putString(const char ...)
Gast
#593880
Jo okay habe ich auch gemacht, aber dann kommt halt die warning wenn ich kein const char übergebe. Möchte man vielleicht auch mal. mgiaco wrote: > Jo okay habe ich auch gemacht, aber dann kommt halt die warning > wenn ich kein const char übergebe. Das glaub ich nicht, Tim. Einen char* an eine Funktion zu übergeben, die einen const char* erwartet ist absolut ungefährlich. Da kann nichts passieren, solange der Programmierer in der Funktion das const nicht wegcastet. Einen const char* an eine Funktion zu übergeben, die einen char* erwartet ist hingegen gefährlich.
Gast
#593984
was meinst du mit wegcasten. Ich weis was casten heißt aber wie ist das mit wegcasten gemeint.
und dann habe ich die paradoxe Situation, dass zwar der Funktionskopf void foo( const char* data ) mir als Aufrufer die Zusicherung gibt, dass sich die Funktion foo nicht am übergebenen String vergreifen wird, ich also bedenkenlos auch einen konstanten String hineingeben darf ...
... sich die Funktion selbst sich aber nicht an diese Zusicherung hält und genau dies versucht. Ich denke es ist nicht notwendig zu erwähnen, dass die Verwendung eines cast um einen const los zu werden, sofort undefiniertes Verhalten des Programmes nach sich zieht.
Gast
#594342
Ja okay, aber wie macht mans denn richtig? Prozessor ist eine ARM7 und ich möchte das die Strings im Flash stehen deshalb const. mgiaco Die Sache ist ganz einfach: Verändert die Funktion den übergebenen String oder verändert die ihn nicht? Wenn die Funktion den übergebenen String nicht verändert, dann machst du den Funktionskopf
Dadurch, dass das Argument ein const char* ist, kannst du das dann auch mit einem konstanten String aufrufen
Verändert aber die Funktion den übergebenen String, dann dokumentierst du das auch im Funktionskopf:
Und dadurch dass das Argument jetzt nur noch ein char* ist, kannst du logischerweise keinen konstanten String im Aufruf benutzen. Denn die Funktion wird ja den String verändern, was bei einem konstanten String nicht gehen wird.
Wie geasagt: Die Sache ist ganz einfach. Du musst dir nur darüber im Klaren sein, welche Aussage 'const' in einem C-Programm macht.
Gast
#594547
Okay, super danke kapiert. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|