wird nichts zugewiesen
-
Hi Con@n,
ich habe jetzt nicht in den Debugger geschaut, aber ich habe das gleiche mal mit zb der Ausgabe xdot[5] gemacht und der richtige Wert kommt heraus. Also intern speichert er es richtig, aber bei der Ausgabe spinnt er

-
Na, man müsste halt schon wissen von welchen Typ xdotakt[] ist...
-
rasidrasid schrieb:
PS:Wenn man das ganze lange Programmcode hier posten muss damit einem geholfen wird....

Muss man nicht, aber man muss zumindest sehen, wie z.B.
mzustande kommt, oder wie die Arrays befüllt werden.
-
Hi Con@n,
auch mit Deinem Code kommen die gleichen komischen Werte heraus. Komisch oder?
Danke
-
rasidrasid schrieb:
Hi Con@n,
auch mit Deinem Code kommen die gleichen komischen Werte heraus. Komisch oder?
Danke
Weil der Fehler, oh Wunder, nicht in dem Code liegt, den Du hier zu zeigen bereit bist...
-
Alles sind doubles.
Ich vermute: irgendetwas mit der Ausgabe stimmt nicht, denn intern sind die Werte gespeichert. Den bei dieser Schleife sind die Werte alles ok:
for(int n=0 ; n < m ; n++) { lnB[n] = log(B[n]); cout << lnB[n] << " " << B[n] << " " << xdot[n] << endl; }im weiteren Verlauf bekomme ich also die Werte B[n] und die Logarithmierten exakt heraus.
irgendwie unverständlich für mich.

-
#include <iostream> #include <string> #include <cmath> #include <fstream> #include <vector> #include <iterator> #include <algorithm> #include <sstream> #include <istream> #include <cstdlib> #include <stdio.h> #include <iomanip> using namespace std; int main (int argc, char *argv[]) { double c1, x0, Fs, Fv, t, deltatime, amp, freq, deltax, c2sum = 0.0; ifstream eingabedatei("druckphase.dat"); vector<string> lines; string line; while( getline( eingabedatei, line ) ) lines.push_back( line ); int j = lines.size(); cout << "Anzahl der Datenzeilen in der Messdatei = " << j << endl; //Zeilenanzahl ist j double F[j], x[j], xdot[j], xdotakt[j], c2[j], B[j], Bakt[j], lnB[j], F2[j], F2dot[j]; // Einlesen aus der Messdatei druckphase x- und y-Werte { ifstream datei("druckphase.dat"); for( int nz = 0; nz < j && datei >> x[nz] >> F[nz]; nz++ ); } // Berechnung der F2-Kraft im Maxwell-Strang for(int n=0 ; n < j ; n++) { F2[n] = -F[n] + Fs + Fv + c1*x[n]; // cout << F2[n] << endl; } int nssum=0, nsum=0, m=0, u=0; // Geschwindigkeitsberechnung der Dämpferbewegung. Achtung n=0 wird nicht betrachtet!! for(int n=1 ; n < j-1 ; n++) { xdotakt[n] = (x[n+1] - x[n-1])/(2*deltatime); F2dot[n] = -(F[n+1] - F[n-1])/(2*deltatime) + c1*xdotakt[n]; c2[n] = -(F[n+1] - F[n-1])/(2*deltax) + c1; // c2sum = c2sum + c2[n]; Bakt[n] = F2[n]/(-xdotakt[n]+F2dot[n]/c2[n]); // cout << Bakt[n] << " " << F2[n] << " " << xdotakt[n] << " " << c2sum << endl; nssum=n; } for(int n=1 ; n < j-1 ; n++) { if(Bakt[n]>=0) { B[m] = Bakt[n]; xdot[m] = xdotakt[n]; m++; nsum=m; cout << xdot[m] << endl; } } cout << nssum-nsum << " negative Zeilen wurden in der Dämpfung entfernt" << endl; // natürlicher Logarithmus - Logarithmieren für das Linearisieren der Regression for(int n=0 ; n < m ; n++) { lnB[n] = log(B[n]); // cout << lnB[n] << " " << B[n] << " " << xdot[n] << endl; } }
-
rasidrasid schrieb:
Warum sollte, wenn es eben n Werte sind, nicht bei 1 angefangen werden

int intArray[5]; int erstesElement = intArray[0]; // Zufallswert, da nicht initialisiert int zweitesElement = intArray[1]; // s.o. //... int fünftesElement = intArray[4]; // s.o. double doubleArray = {0.0}; // Deklariert und mit 0.0 initialisiertdouble c1, x0, Fs, Fv, t, deltatime, amp, freq, deltax, c2sum = 0.0;Vorsicht! Hier wird nur c2sum mit 0.0 initialisiert!
-
int j = ... double F[j], x[j], xdot[j], xdotakt[j], c2[j], B[j], Bakt[j], lnB[j], F2[j], F2dot[j];j ist keine Konstante!
-
Vielleicht verstehe ich euch ja nicht, aber wenn ich den Wert bei 0 nicht brauche oder brauchen kann oder umbedingt bei 1 anfangen muss, warum sollte dann c++ mir komische Werte ausspucken. Sieh dir doch bitte den Code zum Differenzverfahren an, da gibt es Werte mit [n-1]. Da kannst Du doch nicht mit Null anfangen....welcher Wert ist [-1] dann. Also daran kann es doch nicht liegen oder?
-
Danke,
aber alle Variablen sind belegt mit Werten (Vorinitiallisiert). j ist schon int bei mir.
-
Mal machst Du Deine Schleife von 0...n dann von 1...n-1. Das macht es für einen außenstehenden schwerer Deinen Code zu verstehen und Du stellst Dir selber auch Stolperfallen. Mach es einheitlich bzw. kommentiere, warum Du bei einem bestimmten Wert beginnst. Wenn man einen Wert nicht benötigt, dann belege dafür nicht extra Speicherplatz und lass ihn ganz weg.
rasidrasid schrieb:
...aber alle Variablen sind belegt mit Werten (Vorinitiallisiert).
Eben nicht! Du benutzt z.B. Fs oder Fv ohne es vorher zu initialisieren:
double c1, x0, Fs, Fv, t, deltatime, amp, freq, deltax, c2sum = 0.0; //nur c2sum ist 0.0!dann:
// Berechnung der F2-Kraft im Maxwell-Strang for(int n=0 ; n < j ; n++) { F2[n] = -F[n] + Fs + Fv + c1*x[n]; // Fs, Fv == Zufallszahl! // cout << F2[n] << endl; }
-
Hallo,
wie belegst du denn deine Variablen vor? deltatime&co enthalten nur Zufallswerte und im code, den du angibts werden sie nicht verändert.
Grüße
PS: Es ist immer noch am Morgen^^
-
Bei diesem Verfahren musst du mal mit 0 anfangen (alle Werte müssen doch eingelesen werden) und mal mit 1 (die entstehende Differenz bei 1 kommt aus 0 also n-1 und 2 also n+1). Was wäre dann der Wert wenn du bei 0 beginnen würdest? Das Programm müsste irgendein Wert aus einer Speicherstelle nehmen, wo sicherlich nicht ein Wert für mich drin ist (das nenne ich halt mal handling der Messwerte).
-
Diese ganzen Variablen werden aus einer externen Datei schon belegt. Auch deltax und Fs usw. Mach Dir da keine Gedanken, die sind alle mit richtigen Werten belegt. Alles funktioniert einwandfrei, bis auf diesen cout und auch nur in dieser Schleife. Intern bekommen die B[n] Werte die Werte Bakt[n] zugewiesen, das sehe ich an dem logarithmierten Wert. Die sind alle korrekt....müssten sie ja auch, denn wie du siehst kommen 0 Werte heraus die beim Logarithmus probleme verursachen würden.
-
Na, langsam kommen wir voran.
Wenn du die Variablen von extern bespielen willst, dann darfst du die nicht in deiner main nochmal local deklarieren. Das musst du dann außerhalb machen.
Grüße
-
rasidrasid schrieb:
Diese ganzen Variablen werden aus einer externen Datei schon belegt. Auch deltax und Fs usw. Mach Dir da keine Gedanken, die sind alle mit richtigen Werten belegt. ...
Ich kann nur das beurteilen was Du uns hier zeigst (gleiches Thema wie zu Beginn). Was Du uns hier zeigst ist definitiv falsch. Reines Zufallsverhalten. Dass Dein Programm in Wirklichkeit ganz anders aussieht kann ich ja nicht wissen.
Dann zeige uns doch bitte mal wo und wie Du die Werte einliest...
Ich würde Dir außerdem dazu raten Variablen erst so spät wie möglich zu deklarieren (da wo sie benötigt werden) und dabei auch gleich zu initialisieren. Entweder mit 0 oder am besten gleich mit den richtigen Wert (z.B. durch Returnwert einer Funktion).
-
nein nein, nur die Zahlenwerte kommen von extern, eingelesen werden sie innerhalb des main und müssten doch auch da deklariert werden.
liebe Freunde, alles funktioniert einwandfrei bis auf diesen cout und auch nur in dieser Schleife. Eine Schleife weiter, wo logarithmiert wird, da sind die Wert einwandfrei enthalten.
-
ACCCCH, ich sag doch es ist früh am Morgen^^
for(int n=1 ; n < j-1 ; n++) { if(Bakt[n]>=0) { B[m] = Bakt[n]; xdot[m] = xdotakt[n]; nsum=m; cout << xdot[m] << endl; m++; } }versuch mal m erst am Schluss zu erhöhen, dann greift xdot[m] auch nicht auf undefinierten Speicher zu.
-
Dann schreibe das
m++bitte nach demcout.