2017-01-05 11 views
-1

Ich habe versucht, zwei Matrizen zu erstellen und das Produkt in einer anderen Matrix, aber der Compiler gibt einen Fehler von core dump. Die Erstellung der ersten beiden Matrizen ist richtig; etwas stimmt nicht mit der dritten Matrix.Matrix Produkt c, Core Dump Fehler

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

int main() 
{ 

int m; 
int n; 
int t; 
int i; 
int **A; 
int **B; 
int k; 
int j; 
scanf("%d",&n); 
scanf("%d",&m); 
scanf("%d",&t); 
A=malloc(n*sizeof(int*)); 
for(i=0;i<n;i++){ 
    A[i]=malloc(m*sizeof(int)); 
      } 
      for(i=0;i<n;i++){ // A[n][m] 
       for(j=0;j<m;j++) 
        { 
        scanf("%d",&(A[i][j])); 
        } 
       } 
       B=malloc(t*sizeof(int*)); 
       for(i=0;i<t;i++) //B[m][t] 
       { 
       B[i]=malloc(n*sizeof(int)); 
       } 
       for(i=0;i<t;i++){ 
       for(j=0;j<n;j++) 
        { 
        scanf("%d",&(B[i][j])); 
        } 
          } 

          int **C; 


C=malloc(t*sizeof(int*)); 
for(i=0;i<t;i++){{A[i]=malloc(m*sizeof(int));} 


for(i=0;i<t;i++){ 
    for(j=0;j<m;j++){ 
    C[i][j]=0; 

     for(k=0;k<n;k++) 
     { 

      (C[i][j])=(C[i][j])+((A[k][j])*(B[i][k])); 
     } 

    } 

} 


} 


        return 0; 

} 
+0

Gibt es einen Grund, dass Sie die dynamische Zuordnung statt variabler Länge Arrays verwenden, die seit C99 zur Verfügung haben? –

+0

die Übung bitten, auf diese Weise zu tun – fenigo69

+0

Meinst du "der Compiler dumps Kern" oder "das Programm vom Compiler erstellt Dumps Core"?Ich nehme das letztere an - es ist eher selten, einen Compiler zum Absturz zu bringen - aber es ist nicht das, was Ihre Frage sagt. –

Antwort

2

Sie müssen Speicher für C trennen, nicht für A. Deshalb ist, wenn Sie versuchen, C[i][j] zuzugreifen es diesen Fehler erzeugt. Wechsel:

for(i=0;i<t;i++){{A[i]=malloc(m*sizeof(int));} 

zu

for(i=0;i<t;i++){ C[i]=malloc(m*sizeof(int));} 

komplettem Code:

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

int main() 
{ 
    int m; 
    int n; 
    int t; 
    int i; 
    int **A; 
    int **B; 
    int k; 
    int j; 
    scanf("%d",&n); 
    scanf("%d",&m); 
    scanf("%d",&t); 
    A=malloc(n*sizeof(int*)); 
    for(i=0;i<n;i++){ 
     A[i]=malloc(m*sizeof(int)); 
    } 

    for(i=0;i<n;i++){ // A[n][m] 
     for(j=0;j<m;j++){ 
      scanf("%d", &(A[i][j])); 
     } 
    } 

    B=malloc(t*sizeof(int*)); 
    for(i=0;i<t;i++) //B[m][t] 
    { 
     B[i]=malloc(n*sizeof(int)); 
    } 

    printf("B\n"); 
    for(i=0;i<t;i++){ 
     for(j=0;j<n;j++) 
     { 
      scanf("%d",&(B[i][j])); 
     } 
    } 

    int **C; 
    C=malloc(t*sizeof(int*)); 
    for(i=0;i<t;i++){ 
     C[i]=malloc(m*sizeof(int)); 
    } 

    for(i=0;i<t;i++){ 
     for(j=0;j<m;j++){ 
      C[i][j]=0; 
      for(k=0;k<n;k++) 
      { 

       (C[i][j])=(C[i][j])+((A[k][j])*(B[i][k])); 
      } 
     } 
    } 

    return 0; 
} 
+0

Der Code des OP hat immer noch Probleme, die es dazu führen, dass fälschlicherweise das Matrixprodukt zu berechnen. Während dieser Code nicht mehr abzustürzen scheint, gibt er keine korrekte Ausgabe oder nimmt die Eingabe vernünftig. –

+0

@DavidBowling Die Frage war über die Core-Dump-Fehler. Sie können nicht sagen, dass die Antwort falsch ist, weil es nicht sagt, ob es AxB oder BxA ist. – eyllanesc

+0

Nicht zu sagen, dass Sie die Frage von OP nicht beantwortet haben; Die Programmausgabe ist eindeutig falsch. Versuchen Sie, eine 2X3-Matrix und dann eine 3X2-Matrix einzugeben. Die Eingabe wird abgeschnitten, weil die Indizierung unterbrochen ist. Auch aus den Kommentaren im Code, dh "// A [n] [m]" und "// B [m] [t]", ist klar, dass die Intention darin besteht, das Matrixprodukt "AB" zu finden. was in dieser Notation eine "n X t" -Matrix sein sollte. –

1

vorherige Antworten haben das Problem behoben, das den Absturz verursacht, aber der Code ist immer noch kaputt. Es wäre schön, wenn die Variablen aussagekräftigere Namen hätten. Da jede Variable in einer separaten Zeile deklariert ist, können Sie den Platz nutzen, um beschreibende Kommentare zu den Variablen zu geben.

Es ist üblich, zuerst die Zeilen einer Matrix und dann die Spalten zu referenzieren. Also werde ich von Ihrer Verwendung abweichen und sagen, dass die Matrix Am Zeilen und n Spalten hat. B muss dann n Zeilen haben, und es sieht so aus, als ob Sie beabsichtigen, t die Anzahl der Spalten in B zu halten. Dann wird das Produkt C eine m X t Matrix sein.

Ihr Code begann zu schief gehen, wenn Sie Platz für B zugewiesen. Sie haben t Zeilen von n Elementen zugeordnet, wenn Sie für m Zeilen von t Elementen zugewiesen haben sollten (durch Ihre eigene Schreibweise). In meinem Code unten, weil ich die Reihenfolge von m und n geändert habe, weise ich für n Reihen von t Elementen zu.

Dann wird für die Produktmatrix, ich habe für m Reihen von t Elementen zugeordnet, in dem Sie für t Reihen von m Elementen zugeordnet hatten. Die Berechnung der Elemente der Produktmatrix war in Ihrem Code ebenfalls falsch. Das [i][j] Element von C ist das Vektor-Dot-Produkt der i.ten Reihe von A und der j Spalte von B. Die Art und Weise, wie Sie dieses Element berechnet haben, C[i][j] ist das Skalarprodukt der Spalte j von A und der i Zeile von B.

Hier ist der Code mit Korrekturen. Ich habe einige Eingabeaufforderungen und Code zur Anzeige der eingegebenen Matrizen und des resultierenden Produkts hinzugefügt. Hier

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

int main(void) 
{ 

    int m;       // rows in A 
    int n;       // cols in A 
    int t;       // cols in B 
    int i; 
    int **A;      // points to first row of A 
    int **B;      // points to first row of B 
    int **C;      // points to first row of C 
    int k; 
    int j; 

    printf("Enter number of rows in A: "); 
    scanf("%d", &m); 
    printf("Enter number of columns in A: "); 
    scanf("%d", &n); 
    printf("Enter number columns in B: "); 
    scanf("%d", &t); 

    A = malloc(sizeof(int*) * m); // A[m][n] 
    for(i = 0;i < m; i++){ 
     A[i] = malloc(sizeof(int) * n); 
    } 
    for(i = 0; i < m; i++){ 
     for(j = 0; j < n; j++) 
     { 
      scanf("%d", &(A[i][j])); 
     } 
    } 

    B = malloc(sizeof(int*) * n); // B[n][t] 
    for(i = 0; i < n; i++) 
    { 
     B[i] = malloc(sizeof(int) * t); 
    } 
    for(i = 0; i < n; i++){ 
     for(j = 0; j < t; j++) 
     { 
      scanf("%d", &(B[i][j])); 
     } 
    } 

    C = malloc(sizeof(int*) * m); // C[m][t] 
    for(i = 0; i < m; i++){ 
     C[i] = malloc(sizeof(int) * t); 
    } 
    for(i = 0; i < m; i++){ 
     for(j = 0; j < t; j++){ 
      C[i][j] = 0; 
      for(k = 0; k < n; k++) 
      { 
       C[i][j] = C[i][j] + A[i][k] * B[k][j]; 
      } 
     } 
    } 

    printf("Matrix A:\n"); 
    for (i = 0; i < m; i++) { 
     for (j = 0; j < n; j++) { 
      printf("%-5d", A[i][j]); 
     } 
     putchar('\n'); 
    } 

    printf("Matrix B:\n"); 
    for (i = 0; i < n; i++) { 
     for (j = 0; j < t; j++) { 
      printf("%-5d", B[i][j]); 
     } 
     putchar('\n'); 
    }  

    printf("Matrix product:\n"); 
    for (i = 0; i < t; i++) { 
     for (j = 0; j < m; j++) { 
      printf("%-5d", C[i][j]); 
     } 
     putchar('\n'); 
    } 

    return 0; 
} 

ist das Ergebnis eines Testlaufs:

λ> ./a.out 
Enter number of rows in A: 2 
Enter number of columns in A: 3 
Enter number columns in B: 2 
2 3 4 
1 3 5 
3 4 
5 6 
7 8 
Matrix A: 
2 3 4  
1 3 5  
Matrix B: 
3 4  
5 6  
7 8  
Matrix product: 
49 58 
53 62