C Fehlerhaftes Einlesen von Matrixdaten

solareclipse

Cadet 2nd Year
Registriert
Nov. 2015
Beiträge
19
Hallo zusammen,

ich habe ein mysteriöses Problem:
Ich schreibe einen Gauß-Algorithmus zur Lösung eines beliebig großen LGS und habe Probleme aus der Datei die Werte für die Matrix A (System A*v=rh) einzulesen. Hier ein Code-Ausschnitt:
C:
/*-------------------------------------------------------------------------------------------------------------*/
FILE *input;
input = fopen(Dateiname,"r");
if (input!=NULL){
	rewind(input);
	while ((c=fgetc(input))!=EOF){
		if(c=='\n') {zeilenzahl++;}
	}
	zeilenzahl-=1;
	printf("Zeilenanzahl: %d\n",zeilenzahl);

	matrix=amatrix(zeilenzahl);										//Allokierung Matrix
	v=avector(zeilenzahl);											//Allokierung Lösungsvektor
	rh=avector(zeilenzahl);											//Allokierung Rechte Hand Seite
	l=avector(zeilenzahl);											//Allokierung Rechenquotient für GAUSS;

	rewind(input);
		for (i=0;i<zeilenzahl;i++){
			for(j=0;j<zeilenzahl+1;j++){
				if(j!=zeilenzahl){
					fscanf(input,"%le",&matrix[i][j]);
				}
				else if(j==zeilenzahl){
					fscanf(input,"%le",&rh[i]);
				}
			}
		}
	fclose(input);
	}

Die Konsole gibt bei Ausführen des Programms folgendes aus:
Code:
-----Der Name der Einlesedatei lautet: try.txt-----

Zeilenanzahl: -1217253386

Jetzt ist es sehr eigenartig, wenn ich eine zweite Matrix B initialisiere - aber ohne irgend welche Werte zu bestücken - und den Speicher dieser hinterher auch wieder lösche, dann funktioniert auf einmal das Einlesen der Daten in die ursprüngliche Matrix!

Code mit zweiter Matrix:
C:
/*-------------------------------------------------------------------------------------------------------------*/
FILE *input;
input = fopen(Dateiname,"r");
if (input!=NULL){
	rewind(input);
	while ((c=fgetc(input))!=EOF){
		if(c=='\n') {zeilenzahl++;}
	}
	zeilenzahl-=1;
	printf("Zeilenanzahl: %d\n",zeilenzahl);

	matrix=amatrix(zeilenzahl);										//Allokierung Matrix
	v=avector(zeilenzahl);											//Allokierung Lösungsvektor
	rh=avector(zeilenzahl);											//Allokierung Rechte Hand Seite
	l=avector(zeilenzahl);											//Allokierung Rechenquotient für GAUSS;

	bmatrix=amatrix(zeilenzahl);						//zweite Matrix, eigentlich unnütz! Sorgt aber dafür, dass die erste Matrix auf einmal Werte bekommt!??
	v2=avector(zeilenzahl);
	rh2=avector(zeilenzahl);
	l2=avector(zeilenzahl);
	free(bmatrix);
	free(v2);
	free(rh2);
	free(l2);

	rewind(input);
		for (i=0;i<zeilenzahl;i++){
			for(j=0;j<zeilenzahl+1;j++){
				if(j!=zeilenzahl){
					fscanf(input,"%le",&matrix[i][j]);
				}
				else if(j==zeilenzahl){
					fscanf(input,"%le",&rh[i]);
				}
			}
		}
	fclose(input);
	}
Jetzt läuft alles wie geschmiert, die erste Matrix wird befüllt und ich kann meinen Gauß laufen lassen...
Kann mir jemand sagen, warum ich eine zweite Matrix brauche, um die erste zum Laufen zu bringen??? Das ist wirklich sehr strange...

Vielen Dank für eure Antworten!! :)
 
Ich weiss zwar nicht, warum das Ding nicht funktioniert, aber ich weiss, dass du nicht programmieren kannst und dein Code völlig unleserlich ist :p. Der Code ist ja wirklich ein Verbrechen! :freak:

Wahrscheinlich wieder mal ein Fachinformatiker am Werk :rolleyes:

Warum programmierst du das ganze nicht in Python? Das Problem ist höchstwahrscheinlich ein fehlerhafter Speicherzugriff. Wenn du eine Programmiersprache mit automatischer Speicherverwaltung benutzt, dann meldet dir die Laufzeitumgebung einen fehlerhaften Speicherzugriff und das Programm bricht ab. Bei C und C++ ist das nicht der Fall.

Mit Valgrind kannst den Fehler ggf. überprüfen:
sudo apt-get install valgrind astyle
name=myprogram
astyle ${name}.c
rm $name
cc -Wall -g3 -o $name ${name}.c
valgrind -v $name
 
Zuletzt bearbeitet:
Ich habe den Fehler gefunden:
Die Variablen "size" und "zeilenzahl" müssen auch mit Null initialisiert werden!

@niemann: Danke für den Tipp, kannst du mir auch konkret sagen, was denn so furchtbar daran aussieht? Und ja, ich mach das noch nicht so lange, habe auch niemanden der mir über die Schulter schaut und sagt "Uhh das sieht aber doof aus, mach das mal lieber so...!"
 
Jawohl! Erstmal schön bashen ohne Anlass und vollkommen destruktiv, sowas ließt man doch immer gerne :evillol:

Ich würde mich erstmal darum kümmern die Anzahl der Zeilen korrekt auszulesen. Sieht irgendwie fast so aus, als ob du 'zeilenzahl' nicht initialisiert hast?
Danach kann man das mal mitm Speicher in Angriff nehmen. Ohne zu wissen wie die Allokierungsfunktion aussieht, ist es schwer zu raten warum das mit der 2. Matrix plötzlich funktioniert. Die Wurzel des Bösen liegt eh in der falschen Zeilenanzahl.
 
Spider11 schrieb:
Jawohl! Erstmal schön bashen ohne Anlass und vollkommen destruktiv, sowas ließt man doch immer gerne :evillol:

Der Sinn des Bash-Scriptes ist es, das er mit valgrind das Programm auf Speicherzugriffsfehler untersuchen kann. Ich sehe auch keinen Destruktor. Das Programm ist doch in C und nicht in C++ geschrieben?!
 
nieman schrieb:
Der Sinn des Bash-Scriptes ist es, das er mit valgrind das Programm auf Speicherzugriffsfehler untersuchen kann. Ich sehe auch keinen Destruktor. Das Programm ist doch in C und nicht in C++ geschrieben?!

Naja wenn man bisschen Codeverständnis hat, braucht man nicht mit Kanonen auf Spatzen schießen.
Vielleicht ist es ja C++ mit C Bindings :eek:
 
Wieso schreibt jemand, der nicht programmieren kann, Code in C? C ist die schwierigste Programmiersprache. Logischerweise würde ich doch bei Python anfangen und mich dann zu Java, C++, C in Richtung Low-Level bewegen.

Am besten gleich mit Assembler anfangen .. :rolleyes:
 
nieman schrieb:
Wieso schreibt jemand, der nicht programmieren kann, Code in C? C ist die schwierigste Programmiersprache. Logischerweise würde ich doch bei Python anfangen und mich dann zu Java, C++, C in Richtung Low-Level bewegen.

Am besten gleich mit Assembler anfangen .. :rolleyes:

Naja es ist schwer dem Professor beizubringen, dass man jetzt allein Python macht. Vorallem in einer Prüfung ;D
Wir hatten auch 1. Semester C, 2. Semester C++ und 3. Semester tatsächlich Assembler. Danach überhaupt keine Programmiervorlesungen mehr, was eigentlich echt schade ist. Aber eine Wahl hat man hinsichtlich von Prüfungen nicht.
 
nieman schrieb:
Wieso schreibt jemand, der nicht programmieren kann, Code in C?

Weil es, wenn jemand nicht programmieren kann, völlig egal ist in welcher Sprache er nicht programmieren kann.

Aber das wirst Du sicher auch noch lernen.
 
nieman schrieb:
Wieso schreibt jemand, der nicht programmieren kann, Code in C? C ist die schwierigste Programmiersprache. Logischerweise würde ich doch bei Python anfangen und mich dann zu Java, C++, C in Richtung Low-Level bewegen.

Am besten gleich mit Assembler anfangen .. :rolleyes:

Alleine solche Verallgemeinerung zeigen mir, dass du nicht besonders helle bist.....
 
Zurück
Oben