.exe hat 1 Problem festgestellt u. muß beendet werden...



  • Hallo,
    ich bin noch ein Anfänger beim Proggen und Versuche grade einen Hexumwandler zu schreiben ohne das man einfach "hex" benutzt.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int x;
    
        cout << "Bitte geben sie eine Zahl ein: \n\n";
        cin  >> x;
        int i,y,z;
        int Hexar[i];
        for(i=0;x>0;++i)
        {
            y=x/16;
            z=x%16;
            Hexar[i]=z;
            x=y;
        }
    
        for(i;i<=0;--i)
        {
            switch(Hexar[i])
            {
                case 1:
                    cout << "1";
                    break;
    ...
             }
         }
    }
    

    Bei ... geht das Switch noch weiter wollte nicht noch das ganze Switch posten.
    Beim Compilieren tritt kein Fehler auf. Wenn ich die .exe Starte kann ich noch eine Zahl eingeben und dann kommt aber die Fehlermeldung ***.exe hat einen Fehler festgestellt und muss beendet werden.
    Ich benutze den wxDev-C++ auf XP-Sp3, falls das wichtig ist.
    Kann mir jemand sagen wieso der Fehler auftritt?

    Mfg und vorab Danke 🙂



  • ElCappo schrieb:

    int i,y,z;
        int Hexar[i];
    

    Das darf so gar nicht kompilieren, nach ISO-C++.


  • Mod

    Kleine Korrekturen, ohne deinen Algorithmus groß zu verändern:

    #include <iostream>
    using namespace std;
    
    int main()
    {
      int x;
    
      cout << "Bitte geben sie eine Zahl ein: \n\n";
      cin  >> x;
      int i,y,z;
      int Hexar[10];   // 10 digits should be enough for anyone
      for(i=0;x>0;++i)
        {
          y=x/16;
          z=x%16;
          Hexar[i]=z;
          x=y;
        }
    
      for(--i;i>=0;--i)  // Hier willst du größer anstatt kleiner prüfen. Außerdem vorher i um 1 erniedrigen, sonst startest du mit einer 0
        {
          if (Hexar[i]<10) cout << Hexar[i];
          else
            switch(Hexar[i])
              {
              case 10: cout << 'A'; break;
              case 11: cout << 'B'; break;
              case 12: cout << 'C'; break;
              case 13: cout << 'D'; break;
              case 14: cout << 'E'; break;
              case 15: cout << 'F'; break;
              }
        }
    }
    

    edit: Gleich werden natürlich 10 Posts kommen die dir sagen werden, was man alles besser machen kann (ASCII ausnutzen, usw.) und dass es das alles schon fertig gibt (std::hex).



  • Ihr seit aber schnell 🙂
    Also ich habe es wie beschrieben geändert also,

    int Hexar[10];
    

    Nun kommt schonmal keine Fehlermeldung mehr 🙂 Nach der Zahleneingabe geht noch nichts weiter...
    Die Sache mit:

    for(--i;i>=0;--i)
    

    verstehe ich noch nicht ganz, denn ich dachte ich muß als erstes das höchste i ausgeben da, darin doch das erste Auszugebende Hex Zeichen gespeichert wird... Oder nicht?
    Das überarbeite Switch is nice 🙂
    zum Edit hatte ja geschrieben das ich es extra ohne std::hex machen will.

    Mein Edit! Habs doch verstanden hatte ein Zeichen überlesen nun läuft es auch aber ohne das vorgestellte --i.
    Vielen Dank 🙂


  • Mod

    ElCappo schrieb:

    Ihr seit aber schnell 🙂
    Also ich habe es wie beschrieben geändert also,

    int Hexar[10];
    

    Nun kommt schonmal keine Fehlermeldung mehr 🙂 Nach der Zahleneingabe geht noch nichts weiter...
    Die Sache mit:

    for(--i;i>=0;--i)
    

    verstehe ich noch nicht ganz, denn ich dachte ich muß als erstes das höchste i ausgeben da, darin doch das erste Auszugebende Hex Zeichen gespeichert wird... Oder nicht?
    Das überarbeite Switch is nice 🙂
    zum Edit hatte ja geschrieben das ich es extra ohne std::hex machen will.

    Das sollte eigentlich funktionieren, sofern du auch das for veränderst. Der Fehler bei dem for, war folgender:
    1. Du hast vorher die Schleife laufen lassen, SOLANGE i<=0. i ist aber schon zu Anfang größer 0, wodurch natürlich nichts passiert. Die Schleife soll doch eher so lange laufen, wie i größer als Null ist.
    2. Eher ein Schönheitsfehler: Deine Umwandlungsschleife endet, wenn eine Null ausgerechnet wurde, die dann an der i'ten Stelle von Hexar gespeichert wird. Wenn du deine Ausgabeschleife bei diesem letzten Wert von i anfangen lässt, beginnt deine Ausgabe folglich mit eben dieser 0, was unschön aussieht. Deshalb erniedrige ich den Wert von i am Anfang der Schleife mittels --i um 1.


Anmelden zum Antworten