2016-11-20 6 views
-1

Der folgende Code die falsche Antwort geben, ich eingeben:Warum gibt dieser Matrixadditionscode die falsche Antwort? wenn zum Beispiel

1st Matrix 
1 2 3 
4 5 6 
7 8 9 

2nd Matrix 
2 2 2 
2 2 2 
2 2 2 

Es gibt mir diese Matrix Summenausgang:

9 10 11 
9 10 11 
9 10 11 

, die offensichtlich falsch ist! Ich kann nicht finden, warum?

#include <stdlib.h> 
#include <stdio.h> 

int main(void) 
{ 

    int r,c; 
    int ir,ic; 
    int matrix1[r][c]; 
    int matrix2[r][c]; 
    int finalmatrix[r][c]; 

    printf("Insert number of rows of the matrixes (max 10): "); 
    scanf("%d", &r); 
    printf("Insert number of columns of the matrixes (max 10): "); 
    scanf("%d", &c); 


    while(r!=c) 
    { 
    printf("The number of rows and columns are not equal, retry:\n"); 
    printf("Insert number of rows of the Matrix (max 10): "); 
    scanf("%d", &r); 
    printf("Insert number of columns of the Matrix (max 10): "); 
    scanf("%d", &c); 
    } 

    for(ir=1; ir<=r; ir++) 
    { 
     for(ic=1; ic<=c; ic++) 
     { 
     printf("Insert element row %d and column %d of the first matrix: ", ir, ic); 
     scanf("%d", &matrix1[ir][ic]); 
     } 
    } 

    for(ir=1; ir<=r; ir++) 
    { 
     for(ic=1; ic<=c; ic++) 
     { 
     printf("Insert element row %d and column %d of the second matrix: ", ir, ic); 
     scanf("%d", &matrix2[ir][ic]); 
     } 
    } 

    for(ir=1; ir<=r; ir++) 
    { 
     for(ic=1; ic<=c; ic++) 
     { 
     finalmatrix[ir][ic]=matrix1[ir][ic]+matrix2[ir][ic]; 
     } 
    } 

    printf("The sum Matrix is:\n"); 

    for(ir=1; ir<=r; ir++) 
    { 
     for(ic=1; ic<=c; ic++) 
     { 
     printf("%d ", finalmatrix[ir][ic]); 
     } 
    printf("\n"); 
    } 

    return 0; 
} 
+0

Sie matrix Deklaration geht mit undefinierten Werten in r & c; zumindest definieren einige Standard max Werte für sie, wie int r = 100, c = 100; noch besser wäre es, Matrizen dynamisch zuzuweisen – Flanker

+0

danke ich habe jetzt beide Variablen initialisiert und es funktioniert: D –

+0

** Immer ** Compiler Warnungen aktivieren! Jeder moderne Compiler wird eine Warnung vor solchen Situationen anzeigen. – Olaf

Antwort

0

Ihr Code nicht die Variablen r und c bevor erklärt die VLAs mit ihnen zu initialisieren. Sie haben keine Möglichkeit zu wissen, wie groß diese Arrays sind, oder ob r und c sogar positive Werte sind! Ich bin überrascht, dass dieser Code sogar läuft. Ich lief den Code, den Sie auf dem Laufenden, und bekam diesen Laufzeitfehler:

runtime error: variable length array bound evaluates to non-positive value -1208010352

ich die folgende Änderung vorgenommen, und der Code funktioniert:

int r,c; 
int ir,ic; 

printf("Insert number of rows of the matrixes (max 10): "); 
scanf("%d", &r); 
printf("Insert number of columns of the matrixes (max 10): "); 
scanf("%d", &c); 

int matrix1[r][c]; 
int matrix2[r][c]; 
int finalmatrix[r][c]; 

Ausgang für Ihr Beispiel:

The sum Matrix is: 
3 4 5 
6 7 8 
9 10 11 

Gemäß dem Abschnitt der Norm über Array-Deklaratoren:

the [ and ] may delimit an expression.... If they delimit an expression (which specifies the size of an array), the expression shall have an integer type. (ISO/IEC 9899:1999 6.7.5.2/1)

If the size is an expression that is not an integer constant expression... each time it is evaluated it shall have a value greater than zero. (ISO/IEC 9899:1999 6.7.5.2/5)

Also ein negativer Wert für r oder c, was sehr wahrscheinlich ist, führt zu undefiniertem Verhalten, was bedeutet, dass alles passieren kann! Als ich den Code ausgeführt habe, habe ich einen Laufzeitfehler bekommen. Sie haben denselben Code ausgeführt und ein anderes Ergebnis erhalten. Das Verhalten ist undefiniert, daher ist nicht ersichtlich, was passieren könnte.

+0

Vielen Dank!Deine Lösung funktioniert und auch ich habe herausgefunden, dass das funktioniert: int r = 100, c = 100; int ir, ic; int Matrix1 [r] [c]; int Matrix2 [r] [c]; int endgültige Matrix [r] [c]; printf ("Anzahl der Zeilen der Matrizen eingeben (max 10):"); scanf ("% d", &r); printf ("Insert Anzahl der Spalten der Matrizen (max 10): "?); scanf (" % d", &c); so dass im Grunde der Fehler nicht den Variablen initialisiert –

+0

Aber wie initialisiert man die Variablen nicht den Fehler? Überschreibt C sie nicht in dem Moment, in dem ich r und c eingegeben habe? Also war der Fehler im Grunde, dass ich die r- und c-Werte eingegeben habe, nachdem ich beide Matrizen erstellt habe und das System nur aktualisiert und c aber nicht aktualisieren die Matrizen, die mit alten zufälligen Werten? –

+0

Ok so im Grunde der Rat ist, die Variablen IMMER zu initialisieren, wenn ich mit Arrays arbeiten? –

Verwandte Themen