LU Zerlegung
-
Hallo, könnt Ihr mir bitte Helfen den Pseudocode ins C++ zu übersetzen?
void zerlegung(float trix[][3]){ for(int i = 0; i < 3; i++) { //Bestimmen von R for(int j = i; j < 3; ++i) { for(int k = 0; k< i-1; ++k){ trix[i][j]-= trix[i][k] * trix[k][j]; } } //Bestimmen von L for(int j = i+1; j<3; ++j){ for (int k = 0; k < i-1; ++k){ trix[j][i] -= trix[j][k] * trix[k][i]; } trix[j][i] /= trix[i][i]; } } }Segmentation fault, und ich seh nicht den Fehler.
-
Namal schrieb:
Segmentation fault, und ich seh nicht den Fehler.
Vielleicht suchst du an der falschen Stelle.
-
Die untere for-Schleife funktioniert, muss in der oberen sein.
-
Du musst lernen, den Debugger zu verwenden. Dann siehst du sofort, wo der segmentation fault passiert und welche Werte die Variablen haben.
-
Mechanics schrieb:
Du musst lernen, den Debugger zu verwenden. Dann siehst du sofort, wo der segmentation fault passiert und welche Werte die Variablen haben.
Ich hab dgb prog im die Konsole eingegeben (bin nicht sicher ob es richtig ist). Er sagt:
Reading symbols from /home/... (no debugging symbols found)...done.
-
Musst den g++ das Flag -g mitgeben. -O0 und -gdb3 schaden auch nicht. Also "g++ -g -ggdb3 -O0 -Wall -Wextra prog.cc -o prog" (Wall und Wextra hat man sowieso jedesmal mit dabei). Dann findet der gdb auch was.
-
Program received signal SIGSEGV, Segmentation fault.
0x08048727 in zerlegung (trix=0xbffff1dc) at test.cpp:29
29 trix[i][j]-= trix[i][k] * trix[k][j];Dass es die Schleife ist, hab ich schon geahnt, aber ich verstehe immernoch nicht was daran falsch sein soll.
-
Jetzt schau dir die Werte von den Variablen an, dann siehst du welche falsch ist.
-
Das sieht man auch ohne Debugger. Tipp: Check mal die Schleifenköpfe.
-
++i ...Ok jetzt berechnet er mir aber nur die L Matrix. Die R scheint garnicht geschrieben zu werden.
#include <iostream> #include <iomanip> using namespace std; void zerlegung(float trix[][3]){ for(int i = 0; i < 3; i++) { //Bestimmen von R for(int j = i; j < 3; ++j) { for(int k = 0; k<i-1; k++){ trix[i][j]-= trix[i][k] * trix[k][j]; } } //Bestimmen von L for(int j = i+1; j<3; ++j){ for (int k = 0; k < i-1; ++k){ trix[j][i] -= trix[j][k] * trix[k][i]; } trix[j][i] /= trix[i][i]; } } } void ausgabe(float trix[][3]){ int t=0; for(int i=0;i<3;++i) for(int j=0;j<3;++j) { cout<<setw(10)<<trix[i][j]; ++t; if(t>2) { cout<<'\n'; t=0; } } } int main() { float trix[3][3]={ {8, 2, 9}, {4, 9, 4}, {6, 7, 9}, }; zerlegung(trix); ausgabe(trix); }