bitte löschen
-
bitte löschen
-
Schreib mal 1/3 im Dezimalsystem mit allen Stellen hin. Schwierig, nicht wahr?
Und jetzt schreib mal 1/10 im Dualsystem mit allen Stellen hin. Gleiche Schwierigkeit, wie du feststellen wirst.
Was du hier entdeckt hast, ist die Tatsache, dass dein Computer intern irgendwo in einem Zahlensystem arbeitet in dem 1/10 (also 0.1) nicht exakt darstellbar ist, er aber irgendwo die Stellen abschneiden muss, weil er nur endlich viel Speicher hat.
edit: Mit Formatflags kannst du die Stellenzahl bei fprintf beeinflussen. Guck dir mal hier die Beispiele an (ist zwar printf, aber das hat die gleichen Flags):
http://www.cplusplus.com/reference/clibrary/cstdio/printf/
-
bitte löschen
-
Du hast char array_zahl[] = "";
Damit hat dein array Platz für 1 Zeichen ('\0').
Damit du "0.1" da rein schreiben kannst muss aber Platz für mindestens 4 Zeichen sein.
-
bitte löschen
-
adziu24 schrieb:
hmm.. bei der ausgabe scheint das jacke wie hose zu sein
Nö, da kann alles passieren.
adziu24 schrieb:
bsp.?
$ ./your_program Double Zahl eingeben: 2.72 Segmentation fault.
-
adziu24 schrieb:
DirkB schrieb:
Du hast char array_zahl[] = "";
Damit hat dein array Platz für 1 Zeichen ('\0').
Damit du "0.1" da rein schreiben kannst muss aber Platz für mindestens 4 Zeichen sein.hmm.. bei der ausgabe scheint das jacke wie hose zu sein
bsp.?NEIN!
Beisprintf(array_zahl, "%lf", zahl);
werden Zeichen ab der Adresse von array_zahl geschrieben.
Du musst dafür sorgen das da genug Platz ist, sonst wird irgendwas überschrieben oder Programmabsturz.
-
bitte löschen
-
adziu24 schrieb:
Segmentation fault. oder ähnliches hab ich nicht.
ich kann jede zahl reinhämmern, egal wie lang sie ist
hauptsache kleiner als der double wertebereichWeil alles passieren kann. Dir könnten auch Dämonen aus der Nase fliegen (das tut sehr weh).
adziu24 schrieb:
hat char array eine maximale länge?
Ja. In dem Fall 1. Weil bei
char array_zahl[] = "";
keine Länge in den Klammern steht, zählt der Compiler die Länge des Ausdrucks""
, der eine Kurzform für{'\0'}
ist. Deshalb ist die Länge 1.
-
adziu24 schrieb:
Segmentation fault. oder ähnliches hab ich nicht.
ich kann jede zahl reinhämmern, egal wie lang sie ist
hauptsache kleiner als der double wertebereichHör auf das was man dir sagt. Du machst da schlimme Fehler.
Ein Programm um dich umzustimmen:
int main (void) { double zahl; char array_zahl[] = ""; printf("Double Zahl eingeben: "); scanf("%lf",&zahl); printf("Ganzzahl eingeben: "); int kontrollzahl; scanf("%d",&kontrollzahl); printf("Kontrollzahl vorher: %d", kontrollzahl); sprintf(array_zahl, "%lf", zahl); double ausgabe = atof(array_zahl); printf("Erfasste double Zahl: %lf", ausgabe); printf("Kontrollzahl nachher: %d", kontrollzahl); }
Falls dir nicht auffälliges passiert, mach daraus:
int main (void) { int kontrollzahl; char array_zahl[] = ""; printf("Double Zahl eingeben: "); double zahl; scanf("%lf",&zahl); printf("Ganzzahl eingeben: "); scanf("%d",&kontrollzahl); printf("Kontrollzahl vorher: %d", kontrollzahl); sprintf(array_zahl, "%lf", zahl); double ausgabe = atof(array_zahl); printf("Erfasste double Zahl: %lf", ausgabe); printf("Kontrollzahl nachher: %d", kontrollzahl); }
Bei mindestens einem dieser Fälle sollte dir was passieren
-
Mach doch mal
sprintf(array_zahl, "%999.1f", zahl);
und die Länge eines char array ist durch den Adressbereich des Prozessors begrenzt.
-
bitte löschen
-
DirkB schrieb:
und die Länge eines char array ist durch den Adressbereich des Prozessors begrenzt.
So kann man das auch sehen. Im Klartext: C überprüft nicht, ob man über die Grenzen eines Arrays hinauskommt. Man muss selbst darauf achten.
adziu24 schrieb:
int char_array_laenge = strlen(array_zahl);
Verwirr dich nicht mit dem Wort "Länge". Ich meinte oben die Länge des Arrays. Die kann man mit
sizeof(array)
herausfinden. Du meintest mitstrlen(array_zahl)
die Länge des Strings, d.h. die Anzahl der benutzten Zeichen (bis zum ersten Nullzeichen).
-
Was hat das jetzt mit dem ersten Post zu tun?
und die Fälle mit dem Code?
-
adziu24 schrieb:
1.Fall
Double Zahl eingeben: 3.33333
Ganzzahl eingeben: 1000000
Kontrollzahl vorher: 1000000
Erfasste double Zahl: 3.333330
Kontrollzahl nachher: 10000002.Fall
Double Zahl eingeben: 3.33333
Ganzzahl eingeben: 1000000
Kontrollzahl vorher: 1000000
Erfasste double Zahl: 3.333330
Kontrollzahl nachher: 1000000kann den unterschied nicht erkennen - alles korrekt
Ok, du hast anscheinen irgendeinen Kindergartencompiler der alles massiv mit Watte ausstopft, damit es ja nie weh tut, wenn man was falsch macht und man auch bloß nicht merkt, dass man einen Fehler hat
-
DirkB schrieb:
Was hat das jetzt mit dem ersten Post zu tun?
und die Fälle mit dem Code?Hab ich schlecht formuliert, ich wollte das auf den Post von adziu24 von 19:46:34 beziehen. Wird editiert.
-
bitte löschen
-
adziu24 schrieb:
was soll mir dann noch passieren
Das sind nur die üblichen gcc-Parameter. Keine Watte in Sicht. Aber ich verspreche dir, dass du einen segfault bekommst, wenn du nur weit genug über das Ende des Arrays hinausschreibst.
-
mngbd schrieb:
Hab ich schlecht formuliert, ich wollte das auf den Post von adziu24 von 19:46:34 beziehen. Wird editiert.
Ich auch. In 1:10 min krieg ich so ein Post mit Spamabfrage nicht beantwortet
Mir ist der Post von SeppJ durch die Lappen gegangen.
Nur ist in adziu24 Code ein char array_zahl[9]; aufgetaucht, das im Beispiel von SeppJ noch nicht da war. Und darum dreht sich ja die ganze Diskussion.
-
bitte löschen