Anzeige:
Ergebnis 1 bis 10 von 10

Thema: Nicht-const Kopie von const Zeiger

  1. #1
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48

    Nicht-const Kopie von const Zeiger

    Hallo,
    ich habe hier ein
    Code:
    const unsigned char *buffer
    als Funktionsargument (das lässt sich leider nicht ändern), davon mache ich in der Funktion gleich am Anfang eine Kopie
    Code:
    unsigned char *p = buffer;
    um diese dann später zu verändern
    Code:
    p++;
    . Der Compiler (GCC) spuckt jetzt
    warning: initialization discards qualifiers from pointer target type
    aus, obwohl ich buffer ja nicht verändere, auch kein Element auf dass buffer zeigt, sodern nur zwischen den Elementen hin und her springe.
    Wie lässt sich diese Warnung vermeiden?
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  2. #2
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von roadracer Beitrag anzeigen
    Der Compiler (GCC) spuckt jetzt aus, obwohl ich buffer ja nicht verändere
    Das weiß ja der Compiler zu diesem Zeitpunkt nicht. Du könntest ja auf die Idee kommen, den Zeiger an eine Funktion zu übergeben, die dann Änderungen vornimmt etc.

    Wie lässt sich diese Warnung vermeiden?
    Code:
    const unsigned char *p = buffer;

  3. #3
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    aber ich verändere doch p später im programm
    Code:
    p++;
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  4. #4
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Ich habe das jetzt einfach gerade mal ausprobiert und vll. vergaß ich zu erwähnen, dass die Funktion vom Typ (unsigned char *) ist. Jetzt gibt es Probleme beim
    Code:
    return p;
    warning: return discards qualifiers from pointer target type
    Hier nochmal der Aufbau der Funktion:
    Code:
    unsigned char *foo(const unsigned char *buffer) {
       unsigned char *p = buffer;
       [...]
       p++;
       [...]
       return p;
    }
    Okay, jetzt könnte ich einfach aus der Funktion (const unsigned char *) machen, aber was ist das denn bitte?!
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von roadracer Beitrag anzeigen
    davon mache ich in der Funktion gleich am Anfang eine Kopie
    Code:
    unsigned char *p = buffer;
    Naja, das ist eine Kopie des Pointers, nicht des Puffers.
    Wenn einer Funktion ein konstantes Argument übergeben wird, hat der aufrufende Code ansich Recht wenn er annimmt, dass die übergebenen Daten nicht verändert werden.

    Der Compiler warnt hier zurecht dass eine Verletzung dieser üblichen Annahme vorliegt.

    Welche Art von Aufgabe soll die Funktion denn erfüllen?

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Ich habe jetzt keine Lust mich mit so einer Trivialität zu beschäftigen, aber ein
    Code:
    memmove(&p, &buffer, 1);
    vermeidet zumindest die Compilerwarnung. Allerdings performancetechnisch eine Katastrophe.
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  7. #7
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von roadracer Beitrag anzeigen
    aber ich verändere doch p später im programm
    Code:
    p++;
    Ja und? Ein "const char *p" kann man doch problemlos verändern. Das "const" bezieht sich ja nicht auf den Zeiger selber, sondern (nur) auf das, auf was er zeigt. "p++" ist also kein Problem, "*p = 'a'" hingegen schon.

  8. #8
    Registrierter Benutzer Avatar von roadracer
    Registriert seit
    16.02.2010
    Ort
    Wolfenbüttel
    Beiträge
    48
    Lies nochmal meine letzten Posts durch. Dann muss ich den Rückgabewert ändern, nämlich auch nach const unsigned char, das geht aber nicht weil ich mit dieser Funktion ein unsigned char zurückgeben muss. Sonst gibt es den glichen Fehler wie oben genannt. Ich stecke also sozusagen in der const-Falle: der Rückgabewert ist Nicht-const, das Argument aber schon. Da ich an eine API gebunden bin, kann ich beides nicht ändern. Merkst'e wat?
    OpenSUSE 12.1 x86 KDE 4.7

    Alle Rechtschreibfehler unterliegen der GFDL und dürfen so oder in veränderter Form genutzt und weiter gegeben werden.

  9. #9
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Zitat Zitat von roadracer Beitrag anzeigen
    Merkst'e wat?
    Nein (plonk)

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von roadracer Beitrag anzeigen
    Ich stecke also sozusagen in der const-Falle: der Rückgabewert ist Nicht-const, das Argument aber schon.
    Das ist nur dann ein Problem, wenn irgendwo dokumentiert ist, dass der Rückgabewert das veränderte Argument sein muss.
    In diesem Falle wäre ein const Argument aber sehr eigenartig.

    Da ich an eine API gebunden bin, kann ich beides nicht ändern.
    Schon klar, aber welchen Anhaltspunkt hast du, dass das nicht genwünscht ist?

    Eine derarige Signatur bedeutet normalerweise, dass der Rückgabewert auf eine Weise ermittelt wird, die das Argument nicht verändert.

    Siehe zum Beispiel strstr()

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •