mathemanu Geschrieben 18. August 2010 Teilen Geschrieben 18. August 2010 (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 18. August 2010 von mathemanu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. August 2010 Teilen Geschrieben 18. August 2010 Vermutlich zerschießt du dir den Stack, weil du irgendwelche Arraygrenzen überschreitest. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mathemanu Geschrieben 18. August 2010 Autor Teilen Geschrieben 18. August 2010 (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 18. August 2010 von mathemanu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. August 2010 Teilen Geschrieben 18. August 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mathemanu Geschrieben 18. August 2010 Autor Teilen Geschrieben 18. August 2010 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. August 2010 Teilen Geschrieben 18. August 2010 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
mathemanu Geschrieben 18. August 2010 Autor Teilen Geschrieben 18. August 2010 Vielen Dank für die Hilfe. Jetzt funktioniert der gesamte Quellcode ohne Murren. Ja ich werde ein paar Konstanten einführen, danke für den Hinweis. Gruß Manu Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.