2D-Array: Schleife ändert falsche Zellen!



  • Hallo zusammen:

    Ich muss für Physik ein Array mit physikalischen Größen belegen.
    Dazu habe ich das Array folgendermaßen deklariert:

    double gridB [N+3][2];    // Geschwindigkeit[0], Impuls[1], Radius[2]
    

    Beim Initialisieren passiert etwas komisches. Ich habe folgendermaßen initialisiert:

    // Radien
        for(int i=0; i <= N+2; i++)        {
            gridB[i][2] = (i-1)*dr;
        }
    
        printf("%e \n", gridB[150][2]);
    
        // Geschwindigkeiten
        for(int i=0; i <= N+2; i++)        {
            gridB[i][0] = 0;
        }
    
        printf("%e \n", gridB[150][2]);
    

    Wieso liefern die beiden prints unterschiedliche Werte? Eigentlich dürfte doch die Geschwindigkeiten-Schleife an gridB[i][2] nichts ändern? Danke schonmal 😉



  • double gridB [N+3][2]; hat nur die zwei 'Spalten', 0 und 1 .
    Daher ist gridB[i][2] das gleiche wie gridB[i + 1][0] .


  • Mod

    double gridB [N+3][2];    // Geschwindigkeit[0], Impuls[1], Radius[2]
    

    In C++ fangen zwar die Indexangaben für Arrayzugriffe bei 0 an, die Größenangaben bleiben aber dieselben. Du hast ein Array von Arrays von zwei Elementen.

    Der Zugriff gridB[i][2] ist also relativ unsinnig, macht auf jeden Fall nicht was du willst.

    Nimm lieber eine Datenstruktur.

    struct PhysicalInfo
    {
       double velocity, impulse, radius;
    };
    
    PhysicalInfo gridB[N+3];
    
    printf("%e \n", gridB[150][2]);
    

    Och nö. Das ist absoluter Unsinn. printf versucht eine Fließkommazahl auszugeben, vom Speicher den dein Array hergibt.

    Und gerade weil printf so typunsicher ist (und dir keine Fehlermeldung gibt, vielleicht tut dein Compiler das aber) nutzt man in C++ std::cout für Ausgaben.

    Probier' mal

    for( auto p : gridB )
        std::cout << p.velocity << ' ' << p.impulse << ' ' << p.radius << '\n';
    

    Der nächste Schritt wäre ein überladener Insertion-Operator für Streams.



  • Ich Vollidiot!!! Danke, natürlich!^^

    double gridB [N+3][3];    // Geschwindigkeit[0], Impuls[1], Radius[2]
    

    ~(Edit durch Arcoth, Codetags angepasst)~


  • Mod

    ihaveaquestion schrieb:

    double gridB [N+3][3];    // Geschwindigkeit[0], Impuls[1], Radius[2]
    

    Auch wenn es nun technisch richtig ist, ist das immer noch eine ganz schlechte Idee, verschiedene Größen in einem Array zu halten. Das einzige, was du damit bekommst, sind schwer zu findende Logikfehler beim Programmieren. Wenn du zum Beispiel irgendwann mal Geschwindigkeit + Radius berechnest oder anderen Quatsch. Bei der Variante mit dem struct fällt das sofort auf (Und falls du irgendwelche komischen Mythen über schnelle Arrays gehört hast: Das ist in der technischen Umsetzung beides das gleiche). Später kann man sogar noch weiter gehen und den Größen einen entsprechenden Datentyp verpassen, so dass solch ein Fehler sogar vom Compiler gefunden wird.



  • Das sieht mir so aus als ob der Aufgabensteller mal Fortran-Programmierer war. Da ist sowas durchaus üblich.


Anmelden zum Antworten