unerwartete Eingabeaufforderung/ mysteriöse Ausgabe
-
Hi,
ich schreibe grad am gausschen eliminationsverfahren und bin noch anfang, das heißt ich habe jetz die matrix ein- und ausgabe:#include <stdio.h> #include <math.h> float *inmatrix(int m, int n, float A[m][n]){ for(int j=0; j<=m-1;j++){ for(int i =0; i<=n-1;i++){ printf("Geben Sie das Matrixelement (%d,%d) ein: ", j+1,i+1); scanf("%f\n", &A[i][j]); } } return A; } float printarray(int m, int n,float array[m][n]){ printf("\n"); printf("deine Matrix sieht so aus:\n"); for(int j=0; j<=m-1;j++){ for(int i=0;i<=n-1;i++){ printf("%f ",array[i][j]); } printf("\n"); } } int main (){ printf("Wie gro\xe1 ist die Matrix?(m x n)\n"); int m; int n; scanf("%d\n", &m); scanf("%d\n", &n); /*Ax=b*/ float b[m]; float x[m]; float A[m][n]; inmatrix(m,n,A); printarray(m,n,A); return 0; }
das problem ist, das direkt nach der eingabe der matrixgröße (m x n) eine dritte unvorhergesehene eingabe gefordert wird. keine ahnung wo die gespeichert wird und warum. jedenfalls wird dieser wert als (1,1)-element der matix ausgegeben, die anderen werte rücken nach, als der letzte wert der matrix wird nichtmehr gezeigt.
warum passiert das und wie lässt sich das beheben? ich bin absolut verzweifelt!
-
Guck dir nochmal an, wie das mit dem Formatstring von scanf richtig geht. Vorerst behilfst du dir, indem du die \n aus dem Formatstring entfernst.
Und schalte mal Warnungen beim compilieren ein. Bei mir füllt sich bei deinem Programm fasst eine halbe Bildschirmseite mit Compilerwarnungen vor ungewöhnlicher oder schlechter Programmierung. Undefiniertes Verhalten lässt bei solchen Programmen nicht lange auf sich warten.
-
Danke, so funktionierts auf jeden fall schonmal.
zu den warnungen: ich benutze codeblocks un die einzige warnung die der mir gibt ist "return form incopatible pointer type". kann ich da irgendwo noch mehr warnungen anzeigen lassen?
-
jayeahyeah schrieb:
die einzige warnung die der mir gibt ist "return form incopatible pointer type".
Und diese Warnung macht dir keine Sorgen? Überhaupt ist sehr merkwürdig, was du da mit dem return in der Funktion machst. Merke: C wurde so designed, dass der Programmierer im Zweifelsfalle alles besser weiß und der Compiler so ziemlich alles schlucken soll. Nur ist das bei Anfänger eher umgekehrt und der Compiler weiß alles besser. Warnungen sind als Fehler anzusehen, wenn du nicht ganz bewusst irgendwelche Tricks an der Stelle benutzt hast.
kann ich da irgendwo noch mehr warnungen anzeigen lassen?
Bestimmt. Im Zeifelsfall über die Compileroptionen. Beim gcc empfehle ich -Wall -Wextra und für C++ auch noch -Weffc++. Und wenn das Programm auch noch woanders laufen soll noch -pedantic.
-
ja das macht mir in soweit keine sorgen, dass das programm an sich funktioniert und das für mich für den anfang reicht. ich sitze tatsächlich in einem computerphysik kurs in dem man einfach vorraussetzt, dass sowieso schon jeder mensch der erde in c programmieren kann. meine kenntnisse kommen also vom querlesen von verschiedensten tutorials. deshalb muss ich erstmal die programme zur abgabe zum laufen bringen und der rest kommt hoffe ich mit der zeit
-
jayeahyeah schrieb:
ja das macht mir in soweit keine sorgen, dass das programm an sich funktioniert und das für mich für den anfang reicht.
Das ist die schlechtestmögliche Einstellung zu diesem Thema und die, mit der du später die meisten Probleme bekommen wirst. So große Probleme, dass du niemals etwas komplexeres zustande bekommen wirst und frustriert aufhören wirst.
Ob du mir das jetzt glaubst und/oder danach handelst, ist deine Sache. Wenn du kein ernsthaftes Interesse an der Programmierung haben solltest, ist es vielleicht doch die richtige Einstellung.
-
Lass ihn doch. Es reicht ihm doch für den Anfang.
Noch ein Hinweis: Wahrscheinlich hast du dein Programm mit dem gcc und C99 (oder kompatibler Modus) übersetzt, da produziert der Code weniger Fehler als in ANSI C (C89), siehe auch den Subforumsnamen.
C89 und C99 sind 2 C Standards, C99 ist neuer und hat einen erweiterten Sprach- und Bibliotheksumfang gegenüber C89.
-
dass es nicht die beste einstellung ist, ist mir bewusst. punkt ist dabei allerdings: wenn ich mich entscheiden muss zwischen "ich gebe ein funktionstüchtiges aber schlecht gecodetesprogramm ab" und " ich gebe ein super gecodetes programm 2wochen zu spät ab" fällt mir die entscheidung nicht schwer. das soll aber nicht heißen, dass ich keine ambitionen zur verbesserung hab. programmierung in allen ehren aber diese vorlesung ist für mich obligatorisch obwohl ich als physiker vorher noch nie etwas mit programmierung zu tun hatte. dafür reichts mir