PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nicht-const Kopie von const Zeiger



roadracer
11-10-2011, 16:44
Hallo,
ich habe hier ein
const unsigned char *buffer als Funktionsargument (das lässt sich leider nicht ändern), davon mache ich in der Funktion gleich am Anfang eine Kopie
unsigned char *p = buffer; um diese dann später zu verändern
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?

sommerfee
11-10-2011, 18:30
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?



const unsigned char *p = buffer;

roadracer
11-10-2011, 21:18
aber ich verändere doch p später im programm

p++;

roadracer
11-10-2011, 21:50
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
return p;
warning: return discards qualifiers from pointer target typeHier nochmal der Aufbau der Funktion:
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?!

anda_skoa
13-10-2011, 08:42
davon mache ich in der Funktion gleich am Anfang eine Kopie
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,
_

roadracer
13-10-2011, 15:06
Ich habe jetzt keine Lust mich mit so einer Trivialität zu beschäftigen, aber ein
memmove(&p, &buffer, 1); vermeidet zumindest die Compilerwarnung. Allerdings performancetechnisch eine Katastrophe.

sommerfee
13-10-2011, 15:07
aber ich verändere doch p später im programm

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.

roadracer
13-10-2011, 21:18
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?

sommerfee
14-10-2011, 06:23
Merkst'e wat?
Nein (plonk)

anda_skoa
14-10-2011, 14:46
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,
_