www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik strcpy discards qualifiers from pointer


Autor: imax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht um AVR-Studio mit WINAVR(gcc)
strcpy (ssid,"abc");

warning: passing argument 1 of 'strcpy' discards qualifiers from pointer 
target type dann habe ich folgendes versucht:

strcpy ((const char*)ssid,"abc");  // ging auch nicht

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prototype: char strcpy(char *s1, const char *s2);

Wenn der Compiler Argument 1 bei dir anmeckert, dann ist ssid kein char*

Oliver

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>strcpy ((const char*)ssid,"abc");  // ging auch nicht

Um die Warnung zu beseitigen musst Du die übergebene Variable so casten, 
dass sie zu dem Parameter der Funktion passt. Die erneute ausdrückliche 
Angabe der Qualifzierer der Variable nützt Dir nichts. Sie ruft ja 
gerade die Warnung hervor.

Autor: Maxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Qualifier ist das "const"
Qualifier bei pointern beziehen sich immer auf den Zieltyp. Hier macht 
das auch wenig Sinn, weil sich der Inhalt des Ziels ja auch verändern 
soll.

Const bei ssid* weglassen oder einmalig den Wert zuweisen statt strcpy.

Autor: !Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist ssid definiert? Mehr Input (=Quellcode) bitte!

Autor: !Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Vergiss es, zu langsam)

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Qualifier bei pointern beziehen sich immer auf den Zieltyp. Hier macht
>das auch wenig Sinn, weil sich der Inhalt des Ziels ja auch verändern
>soll.

Das muss man doch noch etwas differenzieren, aber mein Rat von oben 
macht tatsächlich keinen grossen Sinn, da der Inhalt auf den der Zeiger 
zeigt verändert werden soll.

const kann sich sowohl auf den Zeiger selbst als auch auf den am Ort des 
Zeigers stehenden Inhalt beziehen. Um das zu unterscheiden, ist die 
position des "const" in der Deklaration entscheidend.

Tatsächlich macht const char * x den Inhalt auf den X zeigt konstant 
aber nicht den Zeiger.

Hingegen ist bei char * const y den Zeiger konstant hingegen aber nicht 
den Inhalt.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
!Gast schrieb:
> (Vergiss es, zu langsam)

Nicht wirklich.
Das vergessen mein ich.

Die Fehlermeldung deutet nämlich auf ein ernsthaftes Problem hin.
Wenn er bei

   strcpy (ssid,"abc");

im ersten Argument ein const wegcasten muss, dann kann das tatsächlich 
ein schwerwiegendes Problem sein! Ein const wegcasten zu müssen, ist des 
öfteren tatsächlich gefährlich und sollte nicht auf die leichte Schulter 
genommen werden. Denn letztendlich hat man dann seinen Compiler 
angelogen! Der verlässt sich nämlich darauf, dass die Dinge, die man ihm 
als const angegeben hat, auch tatsächlich konstant sind und ihren Wert 
nicht über dubiose Praktiken ändern.

Daher: mehr Code!
Dann kann man entscheiden, ob das wegcasten eines const eine 
Kavaliersdelikt ist, oder ob da mehr dahintersteckt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.