Falsche Ausgabe auserhalb der Schleife



  • Abend liebe c++ Freunde,

    Ich hab hier gerade ein sehr komisches Problem,
    Dieser Programmauszug ließt Messwerte in eine Tabelle ein und gibt die alle aus.

    Da ich diese Werte-Tabelle auch später noch brauche habe ich ausserhalb einmal ausgeben, doch es kommt dabei ein anderer Wert raus ( siehe Bild)

    http://img4.imagebanana.com/img/jn50arh3/11.jpg

    Worin liegt mein Fehler??

    ....
    ifstream input;
    input.open(inFile.c_str());
    
    if(!input)
    	cerr << "FEHLER: Datei öffnen fehlgeschlagen";
    
    for (int j = 0; j < 20; j++)
    	{
    		input >> tabelle[1][j];
    		input >> tabelle[2][j];
    		cout << tabelle[1][j] << '\t' << tabelle[2][j] << endl;
    	}
    
    cout << tabelle[1][0] << '\t' << tabelle[2][0] << endl;
    ...
    

    vielen dank
    mfg fraggelfragger



  • kannst du mal einmal zeigen wie du das array definierst?
    Kann es sein, dass du nicht für 20Elemente reserviert hast?



  • //a) Definieren der 20*2 Matrix
    	double tabelle[20][2];
    

    ich poste einfach mal den ganzen Code:
    (selbstverständlich werde ich später das in Unterfunktion bzw. klasse ummformen also bitte nicht davon stören lassen das ich alles in main Methode habe)

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main() 
    {
    
    	//a) Definieren der 20*2 Matrix
    	double tabelle[20][2];
    
    	//b) Einlesen der Werte
    	string inFile = "messungen.txt";
    	string outFile = "auswertung.txt";
    
    	ifstream input;
    	input.open(inFile.c_str());
    
    	if(!input)
    		cerr << "FEHLER: Datei öffnen fehlgeschlagen";
    
    	for (int j = 0; j < 20; j++)
    		{
    			input >> tabelle[1][j];
    			input >> tabelle[2][j];
    			cout << tabelle[1][j] << '\t' << tabelle[2][j] << endl;
    		}
    
    	cout << tabelle[1][0] << '\t' << tabelle[2][1] << endl;
    
    	//Ausgleichsgerade
    	double Sx  =0;
    	double Sy  =0;
    	double Sxx =0;
    	double Sxy =0;
    	int n     =20;
    
    	for (int k = 0; k < 20; k++)
    		{
    			Sx += tabelle[1][k];
    			Sy += tabelle[2][k];
    			Sxx += tabelle[1][k]* tabelle[1][k];
    			Sxy += tabelle[1][k] * tabelle[2][k];
    		}
    
    	double a = (n * Sxy - Sx*Sy) / (n*Sxx - Sx * Sx);
    	double b = (Sy - a* Sx) / n;
    
    	// d) delta_i berechnen
    	double delta_i[20];
    
    	for(int l = 0;l < 20; l++)
    		delta_i[l] = (a * tabelle[1][l] + b ) - tabelle[2][l];
    
    	double fqs = 0;
    
    	for(int m = 0;m < 20; m++)
    		fqs += delta_i[m] * delta_i[m];
    
    	//f) Ausgeben der Rechnungen
    	ofstream output;
    	output.open(outFile.c_str());
    
    	if(!output)
    		cerr << "FEHLER: Datei öffnen fehlgeschlagen"; 
    
    	for (int n = 0; n < 20; n++)
    		output << tabelle[1][n] << '\t' << tabelle[2][n] << '\t' << delta_i[n] << endl;
    
    	output << "\nDer Wert von a : " << a << endl;
    	output << "Der Wert von b : " << b << endl;
    	output << "Der Wert von fqs : " << fqs << endl;
    
    	cin.get();
    
    	return 0;
    }
    


  • for (int j = 0; j < 20; j++) 
            { 
                input >> tabelle[1][j]; 
                input >> tabelle[2][j]; 
                cout << tabelle[1][j] << '\t' << tabelle[2][j] << endl; 
            }
    

    Würde ja funktionieren wenn du dein Array als double tabelle[2][20]; angeölegt hättest.



  • super! vielen dank ( ich schäme mich, das ist echt ein blöder Fehler)
    neija sagen wirs mal so bin weligstens nicht auf den fence post error reingefallen 😃

    Wieso zeigt der aber dann in der Schleife das richtige an??
    Wenn er es da auch nicht getan hätte, wäre ich vllt. auf die Vermutung gekommen das das Array falsch ist.

    mfg fraggelfragger



  • Zugriff auf nicht allokierten Speicher führt zu undefiniertem Verhalten. Das Programm kann alles denkbare machen, incl. das, was du erwartest.

    Möglicherweise gehört dir der Speicher und steht für andere Variablen zur Verfügung. Daher kannst du den frisch eingelesenen Wert korrekt ausgeben. Später schreibst du vll in die entsprechenden Variablen und was herauskommt ist nur noch Müll.



  • Außerdem fangen die Indizes bei 0 an, d.h. du mußt 0 und 1 (nicht 1 und 2) als Index benutzen.


Anmelden zum Antworten