void ptr inkrementieren
-
und so?
p = (char*)p+1;
-
ja jetzt gehts - vielen dank
-
++*(char**)&ptr
-
Bashar schrieb:
++*(char**)&ptr
leider verloren. meine version braucht ein zeichen weniger.
-
wettstreit-freak schrieb:
Bashar schrieb:
++*(char**)&ptr
leider verloren. meine version braucht ein zeichen weniger.
Aber macht sie mehr Sinn deswegen?
Ein void* ist ein Zeiger auf "irgendwas" und weil er nicht typisiert ist, kann er nicht inkrementiert werden. Mit casten auf char* ist das zwar erledigt, aber je nachdem, wie char implementiert ist, können das ein, zwei oder gar vier Byte sein, d.h., das Inkrement ist auch nicht festgelegt.
Man kriegt zwar vielleicht auf einer Plattform funzenden Code, aber er ist nicht mehr sicher portierbar,das nur so als Randnotitz.
-
pointercrash() schrieb:
...aber je nachdem, wie char implementiert ist, können das ein, zwei oder gar vier Byte sein, d.h., das Inkrement ist auch nicht festgelegt.
oh doch, das ist es wohl. wenn du mit 'byte' 8 bits meinst, dann haste recht, aber auf archtitekuren, die nicht 8-bit adressierbar sind, passt es trotzdem. es wird immer um 1 weitergezählt, auch wenn diese 1 mal 16 bits, mal 24 bits oder sonstwas bedeutet. das einzige, worauf man sich verlassen kann ist, dass in ein 'char' mindestens 8 bits passen. also nicht mehr kompatibel wird's erst, wenn du in ein 'char' z.b. den wert 1234 packst, weil das z.b. bei dir gerade geht.
-
pointercrash() schrieb:
Mit casten auf char* ist das zwar erledigt, aber je nachdem, wie char implementiert ist, können das ein, zwei oder gar vier Byte sein, d.h., das Inkrement ist auch nicht festgelegt.
Doch, ein char. Das ist deshalb sinnvoll, weil jeder Datentyp ein Vielfaches der Speichermenge eines char ("byte" im C-Standard) einnimmt. Kleinere Inkremente sind sinnlos.
-
exoticsystem-freak schrieb:
pointercrash() schrieb:
...aber je nachdem, wie char implementiert ist, können das ein, zwei oder gar vier Byte sein, d.h., das Inkrement ist auch nicht festgelegt.
... aber auf archtitekuren, die nicht 8-bit adressierbar sind, passt es trotzdem. es wird immer um 1 weitergezählt, auch wenn diese 1 mal 16 bits, mal 24 bits oder sonstwas bedeutet. das einzige, worauf man sich verlassen kann ist, dass in ein 'char' mindestens 8 bits passen. also nicht mehr kompatibel wird's erst, wenn du in ein 'char' z.b. den wert 1234 packst, weil das z.b. bei dir gerade geht.
Ja, aber ist es das, was Märxchen klein sich davon erhoffte? Einen void* um eins hochzählen hab` ich nie gebraucht und mir fällt jetzt nichts Sinnvolles ein, wozu das gut sein könnte ...
Was hinter einem Pointer steckt sequentiell char- weise abzuarbeiten, ja, echt byteweise hochschalten, nein. Nichts anderes war gemeint.
-
pc() schrieb:
Einen void* um eins hochzählen...
sollte, wenn überhaupt möglich, dieselbe Adresse liefern
-
pc() schrieb:
... Einen void* um eins hochzählen hab` ich nie gebraucht und mir fällt jetzt nichts Sinnvolles ein, wozu das gut sein könnte ...
Autsch, z.B. in meiner Eventqueue oder EEPROM- Lib.
pc() schrieb:
Was hinter einem Pointer steckt sequentiell char- weise abzuarbeiten, ja, echt byteweise hochschalten, nein. Nichts anderes war gemeint.
Was man doch für einen Blödsinn schreibt, wenn's spät wird
Natürlich habt ihr recht, Bashar und Freakman!
Es wird natürlich genau um die Breite inkrementiert, die die Plattform für ein char braucht. Ich bitte um Entschuldigung.
Kam daher, weil ich meine EEPROM- Lib mal jemandem gegeben habe und er gemeint hat, sie täte nicht. Grund war, daß ich damals die Adressen (und Offset) verwendet habe, um im EEPROM die gleichen Adressen zu verwenden. Er hatte jedoch einen DSP, der auch für den char 32 Bit belegt hat, nach nominell 1/4 der Kapazität gab's einen Adress- Rollover in den ersten Block, wo die Verwaltungsdaten des EEPROM sitzen.
Ist aber eigentlich ein völlig anderes Problem, daher leiste ich noch einmal Abbitte
-
Bashar schrieb:
++*(char**)&ptr
Ist interessanterweise nicht plattformabhängig, was die interne Repräsentation betrifft, verstößt aber trotzdem gegen die Aliasingregel in 6.5/7 (C99) bzw. 6.3/6 (C90).
-
Javaner schrieb:
pc() schrieb:
Einen void* um eins hochzählen...
sollte, wenn überhaupt möglich, dieselbe Adresse liefern
wieso? weil sizeof(void) 0 ist?