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 A
m
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
Gibt es einen Grund, dass Sie die dynamische Zuordnung statt variabler Länge Arrays verwenden, die seit C99 zur Verfügung haben? –
die Übung bitten, auf diese Weise zu tun – fenigo69
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. –