globale array-einträge werden immer wieder auf Null gesetzt



  • Hallo:

    Ich habe ein C++-Problem, dass mich langsam verzweifeln lässt.
    Ich definiere am Anfang (ganz oben ausserhalb von main() und
    allen Prozeduren und Funktionen) ein globales Array mit

    #define npsi 1000
    double *psi = new double[npsi];

    So. Nun will in dieses Array in einer Schleife im main() Programm
    Werte hineinschreiben:

    int main(int argc, char *argv[]) {

    ...

    for (double t = 0; t < t_end; t += dt) {

    ...

    Y[2]=...

    ...

    temp = (int) (npsi*t/t_end);
    psi[temp] = Y[2];
    for (int i=1; i<=temp; i++) cout << psi[i] << " ";

    ...

    }

    }

    t ist die Zeit, die abläuft, und temp der Index, der
    aus t berehnet wird. In psi[temp soll dann der Wert Y[2]
    hineingeschrieben werden, während die Zeit t läuft.
    Direkt hinter diesen beiden Anweisungen gebe ich nun
    probehalber das bisher geschriebene Array aus.

    Komischerweise wird nur der letzte Wert psi[temp]
    richtig angezeigt, psi[1] bis psi[temp-1] sind
    Nullen!!!! D.h. eine Zeile des Output sieht z.B. so aus:

    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.66395e-09

    Wo liegt mein Fehler? Ich möchte auf dieses globale
    Array hinterher aus Funktionen und Prozeduren zugreifen
    und die Werte auslesen, aber es sind alles Nullen.

    Andreas



  • Das ist kein globales Array, sondern ein globaler pointer, und das sollte eigentlich ein Compilerfehler geben.



  • Nun habe ich das globale Array so definiert:

    #define npsi 1000
    double psi[npsi];

    Aber das Resultat ist dasselbe. Alle Einträge bis auf den
    letzten sind Null beim Durchlauf der Schleife.

    Irgendwelche Vorschläge? Andreas



  • Ja,

    for (int i=1; i<=temp; i++) cout << psi[i] << " ";
    

    ist falsch. Arrays werden immer von 0 bis Anzahl der Elemente -1 durchlaufen, also wenn dann:

    for (int i=0; i<temp; i++) cout << psi[i] << " ";
    

  • Mod

    Vellas schrieb:

    Ja,

    for (int i=1; i<=temp; i++) cout << psi[i] << " ";
    

    ist falsch. Arrays werden immer von 0 bis Anzahl der Elemente -1 durchlaufen, also wenn dann:

    for (int i=0; i<temp; i++) cout << psi[i] << " ";
    

    temp selbst ist ein gültiger index, der ursprüngliche code ist soweit richtig (aber bei 0 anfangen zu zählen). der fehler ist vermutlich in einem ausgelassenen code-teil zu suchen. der debugger ist dein freund 😉

    Thomas (: schrieb:

    Das ist kein globales Array, sondern ein globaler pointer, und das sollte eigentlich ein Compilerfehler geben.

    welchen?



  • Oh stimmt, ich habe die Zeile darüber übersehen. 🙂



  • Ok, ich bin Fortran 77 Programmierer (Schleifen fangen dort mit 1 an),
    habe mich nur mal in C++ versucht. Aber der Fehler kann doch nicht
    mein Schleifenindex sein! Also, Leute, was soll das?

    Ich habe den gesamten Code mal online gestellt, die mathematischen
    Details sind nebensächlich es geht nur um das globale Array
    psi[npsi], in das ich es nicht vermag, Werte hineinzuschreiben und
    für immer dort zu speichern.

    Hier ist der Code:

    http://www.rzuser.uni-heidelberg.de/~aernst/chemevo3.C

    Wenn irgendjemand die Lösung findet, spendiere ich ein Bier.

    Viele Grüße,

    Andreas


  • Mod

    double Psigeb(double t) {
      int temp;
      if (t<0) t = 0.0;
      temp = (int) (npsi*t/t_end); 
      while ((psi[temp]=0.0)&&(temp>0)) temp--;
      return psi[temp];
    }
    

    das soll sicher keine zuweisung sein.

    und auch hier

    double Phi(double m) {
        if (m<0.08) return 2.01587*pow(m,-0.3);
        else if (m<0.5) 0.16127*pow(m,-1.3);
        else if (m<1.0) 0.08063*pow(m,-2.3); 
        else return 0.08063*pow(m,-2.7); 
    }
    

    fehlt noch etwas.



  • Tausend Dank! Nun klappt es! Ich war kurz davor, das Programm in Fortran oder Java
    neu zu schreiben, da ich den ganzen Nachmittag vergeblich nach dem
    Fehler gesucht habe und ich wirklich nicht sehr firm in C++ bin.

    An welche Adresse kann ich den Sixpack schicken? Mir fällt ein Stein vom
    Herzen. 🙂

    Gruss,

    Andreas


Anmelden zum Antworten