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] << " ";
-
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
-
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