Mehrdimensionales Array



  • Hallo liebe Gemeinde.

    Ich hatte vor, ein Programm zu schreiben, das mir binär von 0 bis 15 zählt.

    Also

    0000
    0001
    0010
    0011
    ....
    1111

    Ich wollte das über einen zweidimensionalen Array machen und habe folgenden Quellcode aufgesetzt:

    include <iostream>
    using namespace std;
    
    int main()
    {
      int Array[16][4] = {{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},      {0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}};
    
      for (int i=0; i<16; i++)
         for(int j=0; i<4; j++)
         {
          cout << "Array [" << i << "][" << j << "]:";
          cout << Array[i][j] << endl;
         }
       return 0;
    }
    

    Bei mir zählt nur der zweite Index hoch und zwar in die Unendlichkeit....

    Wo ist mein Denkfehler??

    Vielen Dank für die Antworten im Voraus.

    Gruß

    Max



  • Ich habe den Code jetzt wie folgt geändert:

    #include <iostream>
    using namespace std;
    
    int main()
    {
      int Array[4][16] = {...};
    
      for(int i=0; i<4; i++)
        for(int j=0; j<16; j++)
        {
         ...;
        }
    
      return 0;
    }
    

    Jetzt funktioniert das ganze Programm nicht.

    Wo ist mein Denkfehler??

    Gruß
    Max



  • Du zeigst uns nicht den echten Code.
    Ideone: http://ideone.com/odMeZT#view_edit_box
    Hier läuft gar nichts gegen unendlich...

    Alles selbst ein zu tippen ist übrigens Wahnsinn-
    Hier mal ein rekursiver Ansatz:

    #include <iostream>
    
    void do_all(unsigned length, std::string const& initial_string = "")
    {
            if(length == 1)
                    std::cout << initial_string << "0\n"
                              << initial_string << "1\n";
    
            else
            {
                    do_all(length - 1, initial_string + '0');
                    do_all(length - 1, initial_string + '1');
            }
    }
    
    int main()
    {
            do_all(4);
    }
    

    Das kann man natürlich noch verbessern, insbesondere dass die ganzen Strings kopiert werden ....

    Das ganze kann man auch als Schleife lösen.



  • silent_max schrieb:

    Ich habe den Code jetzt wie folgt geändert:

    #include <iostream>
    using namespace std;
    
    int main()
    {
      int Array[4][16] = {...};
    
      for(int i=0; i<4; i++)
        for(int j=0; j<16; j++)
        {
         ...;
        }
    
      return 0;
    }
    

    Jetzt funktioniert das ganze Programm nicht.

    Diese zweite Veränderung ist krasser Scheiß. Du greifst damit zu 3/4 auf fremden Speicher zu, weil die zweite Array-Dimension doch 4 ist und nicht 16.



  • Übrigens: Deine Version geht, in dem du eine kleine Sache abänderst:

    #include <iostream> 
    using namespace std; 
    
    int main() 
    { 
      int Array[16][4] = {{0,0,0,0},{0,0,0,1},{0,0,1,0},{0,0,1,1},{0,1,0,0},      {0,1,0,1},{0,1,1,0},{0,1,1,1},{1,0,0,0},{1,0,0,1},{1,0,1,0},{1,0,1,1},{1,1,0,0},{1,1,0,1},{1,1,1,0},{1,1,1,1}}; 
    
      for (int i=0; i<16; i++)
      {
         for(int j=0; j<4; j++)
             std::cout << Array[i][j];
         std::cout << '\n';
      } 
    }
    

    Ideone: http://ideone.com/VmgCVN



  • Sone ... nichts gegen Dich, ich schätz Dich als ehrlichen Poster ein...

    Entweder ich kann weder lesen noch schreiben oder an dem Code ist grundlegend was verkehrt.

    Weil wenn ich das Programm laufen lasse, dann springt ein Fenster auf, in dem ich zwischen

    -> Später online nach einer Lösung suchen und das Programm schließen
    -> Programm schließen
    und
    -> Programm debuggen

    wählen kann.

    Ich muss mir das nochmal genauer anschauen... Weiß einer von euch einen Tipp wo der Fehler liegt????



  • silent_max schrieb:

    Weiß einer von euch einen Tipp wo der Fehler liegt????

    Wahrscheinlich hast du den Code nicht richtig übernommen (ich hoffe, du hast ihn kopiert, bei dir liest es sich so, als hättest du ihn selber abgetippt). Es sollte nämlich funktionieren, siehe hier



  • Sieh doch mal auf ideone. Da läuft alles Problemlos. 😕
    Ich habe alles noch mal auf meinem GCC 4.8 getestet und es läuft reibungslos.

    Oder ist mein Code tatsächlich IB/UB?



  • Tut mir leid aber Sone hat recht. Der erste von dir geposte Code funktioniert wirklich.
    Und bis zur Unendlichkeit?...

    for (int i=0; i<16; i++)
         for(int j=0; j<4; j++)
    

    Die innere Schleife wird 4 mal ausgeführt. Die äußere 16 mal. Kann nie Unendlich sein...

    gruß
    syntax



  • Versteht mich jetzt bitte nicht falsch ...

    Aber ist mein Code bzw. mein Gedankengang so grottenschlecht????????



  • Die Frage ist, was du erreichen willst (also ob es dir z.B. nur darum geht, mehrdimensionale Arrays zu benutzen).

    Das Problem an deinem Code ist, dass es nicht besser ist als zu schreiben

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        cout << "0000" << endl;
        cout << "0001" << endl;
        //usw., den Rest spare ich mir mal
    }
    

    Das wesentliche Problem ist, dass deine Lösung

    1. fehleranfällig
    2. schlecht erweiterbar

    ist, denn (Fehleranfälligkeit) du machst ganz schnell mal einen Tippfehler und (Erweiterbarkeit) wenn du morgen bis 1000 zählen willst, musst du in Sones Quellcode nur eine Zahl ändern, in deiner tippst du erstmal ca. eine halbe Stunde manuell die Zahlen ein, deren Berechnung der Computer dir abnehnmen könnte.

    Felix



  • Phoemuex schrieb:

    Die Frage ist, was du erreichen willst (also ob es dir z.B. nur darum geht, mehrdimensionale Arrays zu benutzen).

    Das Problem an deinem Code ist, dass es nicht besser ist als zu schreiben

    Ja, mir geht es nur darum, mehrdimensionale Arrays zu benutzen. Ansonsten hätte ich den Code nicht so aufgesetzt...

    Ich habe den Code auf Original zurück gesetzt.

    Bei der Ausgabe sieht es jetzt so aus:

    Array[0][2209]: 5316608
    Array[0][2210]: 1040384
    Array[0][2211]:
    

    Nach der letzten Zeile hängt sich das Programm auf und ich weiß nicht, wo der Fehler ist...

    Ich bin schier am verzweifeln...



  • Um deinen Gedankengang beurteilen zu können muss ich zuerst wissen, wie du denkst 😉
    Dein Code ist nicht grottenschlecht.
    Bitte poste per Copy und paste deinen Originalcode.

    gruß
    syntax



  • Habe ich ja getan per Copy und Paste



  • silent_max schrieb:

    Habe ich ja getan per Copy und Paste

    Ok, jetzt wird's Merkwürdig.

    Welchen Compiler benutzt du?



  • Sone schrieb:

    silent_max schrieb:

    Habe ich ja getan per Copy und Paste

    Ok, jetzt wird's Merkwürdig.

    Welchen Compiler benutzt du?

    hat er nicht. musste nicht nach dem compiler fragen. musst nur seinen geposteten quellcode angucken und siehst, dass es nicht sein kann...



  • Ich benutze Microsoft Visual Studio 2010 Ultimate...

    Zumindest habe ich den Code, den ich gepostet habe mit meinem Verglichen ... es ist ein und derselbe Code wie er auf meinem Netbook ist....

    Dafür, dass so "ein langes Leerzeichen" drinnen ist, kann ich nichts dafür ... wobei ich habe dem keine größere Aufmerksamkeit geschenkt´...



  • Allein diese Ausgabe

    Array[0][2209]: 5316608
    Array[0][2210]: 1040384
    Array[0][2211]:

    deckt sich nicht mit deinem geposteten Code!!! Heutzutage gibt es Email, USB-Sticks, mach davon bitte gebrauch. Du bringst doch auch nicht ein komplett anderes Auto in die Werkstatt, als das wo der Schaden vorhanden ist...

    Ich vermute mal einfach, dass du dich bei der for-Schleife vertippt hast und anstatt i z.B. j erhöhst, vergleichst initialisierst, was auch immer... Schau da nochmal genau hin. Anders kann eigentlich keine Endlosschleife entstehen.



  • Ich lauf gleich mit dem Kopf gegen die Wand ...

    Fragt mich nicht, wie ich es gemacht habe, dass auf meinem Netbook in der zweiten for - Schleife es wie folgt hieß

    i<4
    

    Alter ... zwei Stunden umsonst rausgeschmissen ... wobei umsonst war es nicht ... ich bin wenigstens dank euch darauf gekommen, wo der Fehler war.

    Also euch nochmal danke...

    Und eine gute Nacht.

    Gruß

    Max



  • silent_max schrieb:

    Ich lauf gleich mit dem Kopf gegen die Wand ...

    Fragt mich nicht, wie ich es gemacht habe, dass auf meinem Netbook in der zweiten for - Schleife es wie folgt hieß

    i<4
    

    Alter ... zwei Stunden umsonst rausgeschmissen ... wobei umsonst war es nicht ... ich bin wenigstens dank euch darauf gekommen, wo der Fehler war.

    Also euch nochmal danke...

    Und eine gute Nacht.

    Gruß

    Max

    jetzt zähl mal, wie oft hier jmd "copy&paste" geschrieben hat...


Anmelden zum Antworten