wird nichts zugewiesen



  • Hallo,

    ich habe dieses Programm:

    for(int n=1 ; n < j-1 ; n++)
        {
                if(Bakt[n]>=0){B[m] = Bakt[n]; xdot[m] = xdotakt[n]; m++; nsum=m;}
                else{continue;}
                cout << xdot[m] << endl;
         }
    

    Die Variablen werden vorher deklariert. Bakt[n] wird auch als Vektor mit Zahlen belegt. In Bakt[n] kommen auch negative Zahlen vor, die ich mit dieser kleinen Schleife umgehen will. Nun bei cout bekomme ich für xdot oder auch B ständig die Null raus, obwohl Bakt ungleich Null ist und hier doch zugewiesen wird. Wenn ich später die B[m] 's weiter verwerten will, geht das, also bei einer Logarithmierung dieser B[m] 's und einem cout bekomme ich die Werte die ich erwarte. Meine Frage: warum funktioniert cout in dieser Schleife nicht richtig? Irgend ein Fehler hier? Headers und sonst alles ok und auch keine Fehlermeldung beim Compilieren.

    Danke



  • Erstmal richtig formatieren, dann sieht man eventuelle Fehler auch gleich viel leichter:

    for(int n=1 ; n < j-1 ; n++)
    {
      if (Bakt[n]<0)continue;
      B[m] = Bakt[n];
      xdot[m] = xdotakt[n];
      m++;
      nsum=m;
      cout << xdot[m] << endl;
    }
    

    xdotakt[n] wird wohl 0 sein, wenn das ausgegeben wird.
    Außerdem gibst du xdot[m] auch aus, wenn Bakt[n]>=0 ist.
    Und gibt es einen besonderen Grund, warum n bei 1 beginnt?



  • Bei Fragen sollte man relevanten Code posten. Das sollte man nach 81 Posts eigentlich wissen. Und hier ist mehr Code relevant als von Dir gepostet wurde. So kann man die Frage also nicht beantworten.



  • rasidrasid schrieb:

    Hallo,

    for(int n=1 ; n < j-1 ; n++)
        {
                if(Bakt[n]>=0){B[m] = Bakt[n]; xdot[m] = xdotakt[n]; m++; nsum=m;}
                else{continue;}
                cout << xdot[m] << endl;
         }
    

    Hi ,zuvor mal. Wwarum so aufwändig?

    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;
                }
         }
    

    macht doch genau das gleiche und ist übersichtlicher.

    Zu Deinem Problem kann man nicht viel sagen. Die Angaben sind ein wenig dürftig. Hast du mal mit dem Debugger geschaut, ob bei der Ausführung auch wirklich Daten in Bakt&Co drin sind? Die Schleife an sich schaut sonst richtig aus.

    Grüße

    PS: Es ist verdammt früh am Morgen, also Rechtschreibfehler ignorieren.



  • Danke.

    Warum sollte, wenn es eben n Werte sind, nicht bei 1 angefangen werden 😕

    Die xdotakt Werte sind ungleich Null: zb
    -0.0519
    -0.05185
    -0.0363
    -0.03115
    -0.0415
    -0.0415
    -0.0467
    -0.0467
    -0.0415
    -0.04665
    -0.04665
    -0.0519
    -0.0467
    -0.0467
    -0.05705
    -0.05185

    aber als Ausgabe bekomme ich diese xdot Werte:
    2.95014e-289
    2.00268e-307
    4.19306e-311
    2.122e-314
    5.45409e-317
    1.06471e-320
    0
    0
    0
    0
    5.2507e-308
    5.25087e-308
    8.48912e-314
    5.28455e-308
    1.14314e+292
    5.28545e-308
    3.39519e-313
    5.25153e-308
    9.39227e-243
    1.14401e+292
    1.1295e-317
    5.25157e-308
    -5.25003
    1.2311e-307
    5.25403e-308
    1.23109e-307
    1.14594e+292
    1.54388e+292
    5.25167e-308

    Das ist doch irgendwie kurrios.

    Danke

    PS:Wenn man das ganze lange Programmcode hier posten muss damit einem geholfen wird.... 😞



  • 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. m zustande 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 initialisiert
    
    double 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.


Anmelden zum Antworten