Fehlerhaftes Einlesen eines LGS, Fehler "nan"



  • 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:

    /*-------------------------------------------------------------------------------------------------------------*/
    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:

    -----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:

    /*-------------------------------------------------------------------------------------------------------------*/
    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!! 🙂



  • Hast du denn 'zeilenzahl' initialisiert?

    zeilenzahl = 0;
    


  • - du hast Probleme, weil du die dir hier gegebenen Hinweise ignorierst und weiter mit deinem unveränderten fehlerhaften Ursprungsdesign arbeitest
    - warum fragst du dann hier überhaupt?



  • @Th69:
    Vielen Dank! Das war die Behebung des Fehlers! Jetzt klappt alles, wie es soll :p



  • Solche Fehler meldet der Compiler als Warnung!

    Darum beachte die Warnungen und behandele sie wie Fehler: behebe deren Ursache.
    Wenn du die Meldung nicht deuten kannst, dann kannst du hier nachfragen.

    Wenn der Compiler diese Warnung nicht ausgibt, musst du den Warnlevel anpassen.



  • @DirkB:
    Danke für den Hinweis! Der Compiler hat tatsächlich keine Warnung gegeben. Dann muss ich mal sehen, wo man bei Eclipse diesen Warnlevel erhöhen kann...

    @Wutz:
    Danke für deinen Beitrag, du weißt aber schon, dass ich damals auf deinen Hinweis hin, dass meine "Zeilenzähl-Taktik" Müll ist, nachgefragt habe, du mir aber nicht geantwortet hast?



  • Eclipse ist eine IDE, kein Compiler.

    Welche Option das ist, ist Compilerabhängig.
    Bei gcc kannst du z.B. -Wall setzen.


Anmelden zum Antworten