bitte löschen



  • bitte löschen


  • Mod

    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!
    Bei

    sprintf(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 wertebereich

    Weil 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.


  • Mod

    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 wertebereich

    Hö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 mit strlen(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?


  • Mod

    adziu24 schrieb:

    1.Fall
    Double Zahl eingeben: 3.33333
    Ganzzahl eingeben: 1000000
    Kontrollzahl vorher: 1000000
    Erfasste double Zahl: 3.333330
    Kontrollzahl nachher: 1000000

    2.Fall
    Double Zahl eingeben: 3.33333
    Ganzzahl eingeben: 1000000
    Kontrollzahl vorher: 1000000
    Erfasste double Zahl: 3.333330
    Kontrollzahl nachher: 1000000

    kann 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


Anmelden zum Antworten