Zum Inhalt springen

Anderer Quellcode aber gleicher Fehler...


Empfohlene Beiträge

Geschrieben (bearbeitet)

Moin Leute,

ich arbeite mich mal wieder durch einen Programmabschnitt und jedes Mal, wenn ich ein Stück Quellcode einkommentiere bekomme ich ganz komische Ausgaben. Ich habe 2 Sortieralgorythmen im Programm und jedes Mal, wenn ich was mit ner for-Schleife oder so einbinde zerschießt es mir die vorher richtig ausgeführte Sortiererei und er springt auch in vorhergehendem Quellcode auf einmal in Bereiche, die er mit meinen Verwendeten Messdaten nicht erreichen darf und auch ohne den eingefügten Quellcodeteil auch nicht erreicht.

Was mich stutzig macht ist die Tatsache, dass der Ceash immer gleich aussieht.

Ich habe einfach mal folgenden Quellcodeschnipsel vor return 0; eingefügt:


int kl=0;


for(i=0;i<2;i++)

{

	kl++;

}

Da dürfte doch eigentlich überhaupt nichts passieren, oder?

Total komisch. Ich verstehe vor allem nicht, wie er da ganz unten dann auf die Idee kommt, ganz oben auf einmal Quellcode abzuarbeiten.

Ich bin schon eher ratlos muss ich sagen.

Vllt kennt ja jemand sowas, oder hat einen nützlichen Tipp für mich.

Schon mal vielen Dank für eure Zeit.

Manu

Edit:

Vor allem behandelt der dann abgearbeitete Quellcode eine if-Abfrage, die Überhaupt nichts mit kl oder so zu tun hat, sondern mit einem array.

Bearbeitet von mathemanu
Geschrieben (bearbeitet)

Ich habe jetzt mal alles auskommentiert und von oben nach unten getestet, wo es mit den Fehlern anfängt. Wenn ich folgenden Quellcode einfüge, bricht er mir die exe sofort ab, mit dem schönen Windows-Fehler-Bericht.


int pulse;


std::cout << "Bitte die Anzahl der Pulse eingeben (nicht mehr als 7):\t";

std::cin >> pulse;

std::cout << "\n";

std::cin.get();


Daran ist doch nichts falsch, oder? Ich frage mich so langsam was ich da so programmiert habe ,wenn mein Programm scheinbar so inkonsisten ist^^

Manu

Edit: Das einzige was ich vorher mache ist Daten aus einer Datei einlesen und diese dann in arrays speichern. Ich habe überall nochmal geschaut, ob ich nicht über irgendwelche array-Grenzen komme und mir alles nochmal ausgeben lassen um zu schauen, ob da was schief geht, aber die Daten sehen gut aus...

Bearbeitet von mathemanu
Geschrieben
Ich habe jetzt mal alles auskommentiert und von oben nach unten getestet, wo es mit den Fehlern anfängt.

Das Problem steckt in solchen Fällen praktisch nie da, wo sich die ersten Probleme bemerkbar machen. Wenn du dir den Stack zerschießt, fliegt dir das irgendwann später um die Ohren. Vielleicht bekommst du auch nur seltsame Werte, oder es läuft, wie es soll.

Wenn ich folgenden Quellcode einfüge, bricht er mir die exe sofort ab, mit dem schönen Windows-Fehler-Bericht.
Du kannst jetzt viele Experimente machen, wie sich dein Programm verhält, nachdem es sich den eigenen Speicher kaputtgemacht hat, aber das bringt nichts.

Wenn du den relevanten Code nicht zeigen willst, dann überprüf selbst sämtliche Array- und Zeigerzugriffe. "Sieht gut aus" reicht da nicht, da ist ernsthaftes Prüfen angesagt.

Geschrieben

Also folgender Code ist zum auslesen und verarbeiten der Messdaten:


#include <stdio.h>

#include <stdlib.h>

#include <fstream>

#include <string>

#include <sstream>

#include <iostream>

#include <iomanip>

#include <algorithm>

#include <iterator>

#include <math.h>

#include <locale.h>

#include <string.h>

#include <vector>


#define PI 3.14159265


// using namespace std;


struct ReplaceCommaWithPeriod

{

	char operator() (char c)

	{

		if(c==',')

			return '.';

		return c;

	}

};



int main(){



//////////////////////////////////////////////////////////////////////////////////////////////////

// Einlesen der ersten Schwingung (Ch1  bzw Lissajou2) 

//////////////////////////////////////////////////////////////////////////////////////////////////	


std::ifstream in("LissajouDaten2.lvm");

in.unsetf(std::ios_base::skipws);

std::stringstream ss;


transform(

	std::istream_iterator<char>(in),

	std::istream_iterator<char>(),

	std::ostream_iterator<char>(ss),

	ReplaceCommaWithPeriod()

	);


std::vector<float> newrows;

copy(

	std::istream_iterator<float>(ss),

	std::istream_iterator<float>(),

	back_inserter(newrows));


// 	cout<< newrows[3]<<endl;

// 	cin.get();


float beidemessungen[10000][2];	


for(int i=0; i<10000;i++)		// Typumwandlung von string in float

{			

	std::stringstream sstr;

	sstr<<newrows[i];

	sstr>>beidemessungen[i][0]; 

}


// std::cout << beidemessungen[1][0] <<std::endl;

// std::cin.get();



//////////////////////////////////////////////////////////////////////////////////////////////////

// Einlesen der zweiten Schwingung (Ch2 bzw Lissajou1)

//////////////////////////////////////////////////////////////////////////////////////////////////	



std::ifstream in1("LissajouDaten1.lvm");

in1.unsetf(std::ios_base::skipws);

std::stringstream ss1;


transform(

	std::istream_iterator<char>(in1),

	std::istream_iterator<char>(),

	std::ostream_iterator<char>(ss1),

	ReplaceCommaWithPeriod()

	);


std::vector<float> newrows1;

copy(

	std::istream_iterator<float>(ss1),

	std::istream_iterator<float>(),

	back_inserter(newrows1));


// 	cout<< newrows1[3]<<endl;

// 	cin.get();


for(int i=0; i<10000;i++)		// Typumwandlung von string in float

{			

	std::stringstream sstr;

	sstr<<newrows1[i];

	sstr>>beidemessungen[i][1]; 

}


//  std::cout << beidemessungen[1][1] <<std::endl;

//  std::cin.get();	



/////////////////////////////////////////////////////////////////////////////////////

// Schreiben in Datei "figur.dat"

/////////////////////////////////////////////////////////////////////////////////////



std::ofstream schreiben1;

schreiben1.open("C:\\figur.dat");

for(int k=0;k<10000;k++)

{

	schreiben1 << beidemessungen[k][1];

	schreiben1 << "\t";

	schreiben1 << beidemessungen[k][0];

	schreiben1 <<"\n";

}

schreiben1.close(); 



/////////////////////////////////////////////////////////////////////////////////////

// Mittelwertbildung (Rauschen filtern)

/////////////////////////////////////////////////////////////////////////////////////


float mittelwert[10000][2];

float mittel=0;


for(int k=0;k<9970;k++)

{

	for (int i=51;i>0;i--)

	{

		mittel+=beidemessungen[k+i][0];

	}

	mittel=mittel/10;

	mittelwert[k][0]=mittel;

	mittel=0;

}


// std::cout << mittelwert[100][0] << std::endl;

// std::cin.get();


///////////////////////////////////////////////////


for(int k=0;k<9970;k++)

{

	for (int i=21;i>0;i--)

	{

		mittel+=beidemessungen[k+i][1];

	}

	mittel=mittel/10;

	mittelwert[k][1]=mittel;

	mittel=0;

}


// std::cout << mittelwert[100][1] << std::endl;

// std::cin.get();



/////////////////////////////////////////////////////////////////////////////////////

// Schreiben in Datei "mittelwert.dat"

/////////////////////////////////////////////////////////////////////////////////////


std::ofstream schreiben2;

schreiben2.open("C:\\Programme\\Lissajou\\mittelwert.dat");

for(int k=0;k<10000;k++)

{

	schreiben2 << mittelwert[k][0];

	schreiben2 << "\t";

	schreiben2 << mittelwert[k][1];

	schreiben2 << "\n";


}

schreiben2.close(); 



/////////////////////////////////////////////////////////////////////////////////////

// Einzelne Ausgabe der Mittelwerte 

/////////////////////////////////////////////////////////////////////////////////////


std::ofstream schreiben3;

schreiben3.open("C:\\Programme\\Lissajou\\mittelwert1.dat");

for(int k=0;k<10000;k++)

{

	schreiben3 << mittelwert[k][0];

	schreiben3 << "\n";


}

schreiben3.close(); 



std::ofstream schreiben4;

schreiben4.open("C:\\Programme\\Lissajou\\mittelwert2.dat");

for(int k=0;k<10000;k++)

{

	schreiben4 << mittelwert[k][1];

	schreiben4 << "\n";


}

schreiben4.close(); 


// std::cout << mittelwert[10][1];

// std::cin.get();


Ich hoffe der Quelllcode ist nicht zu amateurhaft^^ ich bin noch blutiger Anfänger.

Manu

Geschrieben


for(int k=0;k<9970;k++)
{
for (int i=51;i>0;i--)
{
mittel+=beidemessungen[k+i][0];
}
[/CODE]

k+i erreicht hier 10020.

Diese vielen "Magic Numbers" verschlechtern die Wartbarkeit des Codes extrem.

Führ da besser ein paar Konstanten ein.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...