0. und letzte Spalte in Arrays



  • Hallo,

    wir haben folgendes Array definiert:
    long double *T_out = 0
    T_out = new long double
    [1]; T_out[1]=new long double[nx]; T_out[0]= new long double[nx];

    nx ist eine Integer mit Wert 1600. Wir haben beim Einlesen meines Erachtens korrekt die 0. bis 1600. Spalte mit Werten besetzt, bzw. diese lassen sich über cout korrekt abrufen.

    Am Beginn einer while Schleife möchte ich folgenden Wert von der ersten in die 0 Zeile mit folgendem Befehl kopieren:
    T_out[0][0]=T_out[1][0]

    Dies scheint nicht wirklich zu klappen. Auch ein anderer Wertzuweisungsbefehl für die letzte Spalte geht nicht (j=1600)
    T_out[0][j]=T_out[1][j]+dichte_dt/1300* qterme_out[1][j];

    Auch möchte ich am Ende der while Schleife die komplette Zeile 0 in die Zeile 1 verschieben, was mit dem Aufruf folgender Funktion auch nicht funktioniert:

    void Rowshift(long double** werte,  int nx){        ///Werte werden um einen Zeitschritt zur�ckgestuft.
        for( int i= 0; i <nx; ++i){                     ///Vielleicht kennt jemand ein effizienteres Vorgehen. Ich habe ybr_out[1]=ybr_out[0]; T_out[1] = T_out[0]; versucht. Bekam keine error Meldung, aber falsche Werte.
        werte[1][i]=werte[0][i]; werte[0][i]=0;}
    

    Die Funktion habe ich aufgerufen mit Rowshift(T_out, nx);.

    Kann mir jemand eine Rückmeldung geben, inwiefern man die 0. Spalte eines Arrays besetzen darf / sollte und was man beim verschieben von Werten zwischen Arrays beachten sollte und wo meine Fehler liegen könnten.

    VG, Dennis



  • Du meinst

    T_out = new long double*[2];
    

    !!!
    Das wurde dir doch schon in einem anderen Beitrag geschrieben (sofern ich das richtig in Erinnerung habe - finde ihn aber gerade nicht wieder).



  • Du hast Platz für 1600 Werte.
    Da du bei 0 anfängst (anfangen musst), ist der höchste gültige Index 1599.



  • Th69 schrieb:

    Das wurde dir doch schon in einem anderen Beitrag geschrieben (sofern ich das richtig in Erinnerung habe - finde ihn aber gerade nicht wieder).

    Ja das war dieser Thread: https://www.c-plusplus.net/forum/336207.



  • Das wurde dir doch schon in einem anderen Beitrag geschrieben (sofern ich das richtig in Erinnerung habe - finde ihn aber gerade nicht wieder).

    Ja, da hatte ich aber eine Frage zum Ein/Auslesen und zur Deklaration.

    Du meinst
    C++:
    T_out = new long double*[2];

    Muss es eine [2] sein, wenn ich nur zwei Zeilen haben will. Ich kann eigentlich die Zeile [0] und [1] problemlos beschreiben und ausgeben lassen, bis auf die Befehle, die ich zitiert habe.

    Du hast Platz für 1600 Werte.
    Da du bei 0 anfängst (anfangen musst), ist der höchste gültige Index 1599.

    Also ich kann problemlos auch den 1600 Wert belegen, wenn ich 1600 deklarariet habe, bzw. mit cout << T_out[1][1600] ausgeben, aber T_out[0][1600]=T_out[1][1600]+dichte_dt/1300* qterme_out[1][1600]; und rowshift() funktionieren nicht.


  • Mod

    numerikzeug schrieb:

    Also ich kann problemlos auch den 1600 Wert belegen, wenn ich 1600 deklarariet habe, bzw. mit cout << T_out[1][1600] ausgeben, aber T_out[0][1600]=T_out[1][1600]+dichte_dt/1300* qterme_out[1][1600]; und rowshift() funktionieren nicht.

    C++ ist kein Ponyhof. Du wirst nicht an die Hand genommen und vor deinen eigenen Fehlern beschützt, andererseits wirst du auch nirgendwo zurück gehalten, weil der Babysitter erst prüfen muss, ob alles in Ordnung ist. Die Indizes in einem Array mit 1600 Elementen laufen von 0 bis 1599. Basta! Wenn du darüber hinaus zugreifst, kann alles passieren. Kann unter anderem auch mal zufällig funktionieren. Ist aber trotzdem falsch und es ist deine Verantwortung als C++-Programmierer, alle diese Regeln zu kennen und dich an diese zu halten (oder die Konsequenzen zu tragen, wenn du es nicht tust).

    Was dir die Sache einfacher machen dürfte: Nutz keine rohen Arrays! Nutz kein new! Das ist nicht, wie man C++ programmiert. Nutz die vorgefertigten Container der STL, die diese Konzepte kapseln! Durch die Kapselung ist es dann sogar möglich, einen Babysitter einzuschalten, der alle Zugriffe prüft und diesen später wieder rauszuwerfen, wenn man sicher ist, dass das Kind auch alleine zurecht kommt.


Log in to reply