Als Verringerungsoperand wird L-Wert erfordert

Zack

cookies vader
Hallo,

ich bin aktuell dabei ein wenig C zu lernen. Unser Prof hat und die Aufgabe geben einen int als Dezimal, Hexadezimal und Binärziffer dazustellen. Ich wollte die Chance nutzen und mich mit Pointer auseinandersetzten. Rein von meinen Überlegungen her, sollte das auch funktionieren. Ich bekomme aber den Fehler:

Code:
$ gcc foo.c -o foo
foo.c: In Funktion »crtBitStr«:
foo.c:12:16: Fehler: Als Verringerungsoperand wird L-Wert erfordert

C:
#include <stdio.h>
#include <stdlib.h>

char vBuf[128];

char* crtBitStr(unsigned int x)
{
    static char buffer[sizeof(x) * 8 + 1];
    int i = 0;
    for (i = sizeof(x) * 8; i >= 0; i--) {
        *buffer-- = (x & 1) + '0';
        x >>= 1;
    }

    return buffer;
}

int main(int argc, char **argv)
{
    unsigned int x = 0;

    printf("Eingabe der Zahl: ");
    fgets(vBuf, 128, stdin);
    x = atoi(vBuf);

    printf("***\n");
    printf("dez: %d \n", x);
    printf("hex: %x \n", x);
    printf("bin: %s \n", crtBitStr(x));
    printf("+++\n");
}

Kann mir jemand erklären was da falsch läuft?

Vielen Dank!
 
Hi

diese Zeile?
C++:
*buffer-- = (x & 1) + '0';
Du willst vermutlich einen Pointer, der auf den Schluss vom Speicher zeigt,
und mit dem immer weiter nach vorn gehen?

a) buffer zeigt nicht auf den Schluss, sondern auf den Anfang

b) Vom Prinzip her ist buffer ein Pointer, der auf "seinen" Speicherbereich zeigt, ja.
Aber: Bei dieser Array-Anlegungsart verbietet einem der Compiler,
den Pointer beliebig zu verwenden, also das Pointerziel zu ändern.
buffer wird immer auf diese 1+8*sizeof Byte zeigen.
Zum Drüberlaufen braucht man eine zweite Variable
(die auf das letzte noch dazugehörende Byte zeigt)
C++:
char *p = buffer + 8*sizeof(x);


Noch zwei Sachen:

Wenn du einen String für 3 Buchstaben willst brauchst du ein buffer[4],
weil da noch ein Schlusszeichen reinmuss (bzw. wenigstens dann,
wenn printf usw. damit umgehen können sollen).
Das ist bei dir ok, wegen dem +1 beim Anlegen.
Und die 4 Elemente des Arrays buffer sind dann buffer[0], buffer[1], buffer[2] und buffer[3].
0,1,2 die Buchstaben, 3 das Ende.
Deine Schleife beginnt mit dem Füllen der Binärzahl aber schon bei 3.
Besser so:
C++:
for (i = sizeof(x) * 8 - 1; i >= 0; i--)

Und das Endzeichen selbst wird nirgends in die letzte Stelle geschrieben.
 
Zurück