Was ist falsch ?
-
Ich möchte den Code ehrlich gesagt weitgehend so lassen wie er ist, eben nur diesen Fehler beseitigen.
Das mit ( zahl - h ) / 10 stimmt schon , die Umwandlung selber funktioniert ja auch, nur zeigts mir vorne eben den int wert als 0 an beim ausführen.
Aber danke schonmal.
-
wieso nummst du nicht atoi() und sprintf()?
-
Binggi schrieb:
wieso nummst du nicht atoi() und sprintf()?
Weil der Sinn der Übung eben ist die Funktion selber zu schreiben, sonst hätt ich schon längst atoi genommen.
-
saabzero schrieb:
Binggi schrieb:
wieso nummst du nicht atoi() und sprintf()?
Weil der Sinn der Übung eben ist die Funktion selber zu schreiben, sonst hätt ich schon längst atoi genommen.
Dann ist es nicht schlecht sich an atoi und itoa bezüglich der Parameter zu orientieren.
Du hast in ZahlInTextUmwandeln
zahl = ( zahl - h )/10;
Dadurch wird zahl verändert. zahl ist global. Was erwartest du?
Statt ( zahl - h ) / 10 reicht zahl/10 da das mit Integern gemacht wird. Dann aber bitte lokal.
-
[quote="saabzero"]
unsigned char bm = 0x80; int i; void CharAlsBinaryAusgeben(unsigned char zahl) { for (i=0; i<8; i++) { if ((zahl&bm)>0) printf("1"); else printf("0"); bm = bm>>1; } }
also das ist schon mal sicher falsch... ich würde bm=1 nehmen und dann in einen string schreiben und dann den string drehen. das sollte das einfachste sein.
zahl = (zahl + zahl_als_text[i]-0x30);
ist auch falsch.
@edit falls du bei deinem 0x80 bleiben willst musst du in die andere richtung shiften, und ne flag einführen weil die ausgabe erst nach der ersten 1 beginnen sollte..
-
[quote="_--"]
saabzero schrieb:
unsigned char bm = 0x80; int i; void CharAlsBinaryAusgeben(unsigned char zahl) { for (i=0; i<8; i++) { if ((zahl&bm)>0) printf("1"); else printf("0"); bm = bm>>1; } }
also das ist schon mal sicher falsch... ich würde bm=1 nehmen und dann in einen string schreiben und dann den string drehen. das sollte das einfachste sein.
zahl = (zahl + zahl_als_text[i]-0x30);
ist auch falsch.
@edit falls du bei deinem 0x80 bleiben willst musst du in die andere richtung shiften, und ne flag einführen weil die ausgabe erst nach der ersten 1 beginnen sollte..
Warum soll das falsch sein ?
Das Programm funktioniert so.
-
saabzero schrieb:
Warum soll das falsch sein ?
Das Programm funktioniert so.huch, ja hast natürlich recht, dachte du verschiebst die variable und nicht die maske
-
Das ist falsch. Versuch das mal mehrere Male hintereinander aufzurufen. Warum verwendest du für Alles globale Variablen?
-
Vicious Falcon schrieb:
Das ist falsch. Versuch das mal mehrere Male hintereinander aufzurufen. Warum verwendest du für Alles globale Variablen?
Inwiefern falsch ?
Ich hab mir das auf einem Blatt Papier schön durchüberlegt, sollte ansich doch stimmen.
Ich shifte die Maske 0x80 mit jedem Schleifendurchgang eine Stelle weiter nach rechts und Frage damit die Zahl a bzw. b mit & ab.Und das Programm lässt sich so auch ausführen und funktioniert.
Das mit den Variablen ist so.
Ich programmier jetzt seit ca. 2 Wochen ... bin also quasi ein n00b... und die Funktionen verstehe ich noch nicht wirklich ganz.
Sprich wenn ich die jeweiligen Variablen in den Funktionen deklariere habe ich Probleme mit diese dann ins Main zu bringen bei der Ausgabe ... schwer zu erklären mein Problem, aber hoffe wenn ich mich weiter mit der Materie beschäftige wird das.
-
Beim ersten Aufruf ist das Ergebnis ja noch richtig. Ich hatte geschrieben, dass du die Funktion mal mehrere Male nacheinander aufrufen solltest:
CharAlsBinaryAusgeben(32); CharAlsBinaryAusgeben(48);
Du veränderst die global definierte Maske, initialisierst sie aber nicht wieder.
Bei folgenden Aufrufen testest du also nur gegen 0. Dies ist wieder Mal ein Fall, der zeigt, dass globale Variablen zu fehleranfälligem Code führen können. Hättest du sie lokal definiert und gleich initialisiert, wäre alles in Ordnung.Nur am Rande: Eine Maske brauchst du auch nicht unbedingt, und da du den Rechtsshift schon verwendet hast:
void Ausgabe(unsigned char c) { int i=7; for(;i>=0;--i) printf("%d",((c>>i) & 1)); puts(""); }
c>>i
verschiebt, wie du ja weißt, die Bits um i stellen nach rechts, von links werden Nullen aufgefüllt.& 1
testet nun, ob das niedrigstwertige Bit (20) gesetzt ist.
Eine if-Abfrage braucht man auch nicht unbedingt. Die Ausgabe ist entweder
1 & 1 = 1 -> Bit gesetzt.
0 & 1 = 0 -> Bit nicht gesetzt.Edit: Falls du mit einem C99-fähigen Compiler arbeitest, kannst du int i = 7 auch direkt in den Schleifenkopf schreiben. i ist dann nur im Schleifenkörper sichtbar.