2

Ich habe dieses Programm für eine Hausaufgabe und es stürzt ohne Fehler beim Ausführen ab.multidimensionale Arrays variabler Länge

Auch nach der Korrektur werden Vorschläge zur Erhöhung der Effizienz meines Codierungsansatzes begrüßt.

Zuerst habe ich m, n, p, q als globale Variablen deklariert und ich habe nur die Arrays an die Funktionen übergeben, aber das Programm hat sich seltsam verhalten.

Dann habe ich die Dimensionen der Arrays als Argumente in jeder Funktion und deklariert es überall. CRASH

* VLA UNTERSTÜTZTEN

//functions on matrices 
#include<stdio.h> 

int i, j; 
void getMatrix(int m, int n, int values[m][n]); 
void displayMatrix(int m, int n, int values[m][n]); 
void transposeMatrix(int m, int n, int values[m][n]); 
void addMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]); 
void multiplyMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]); 

int main() 
{ 
    int m, n, p, q, A[m][n], B[p][q]; 

    printf("Enter the no. of Rows of the first Matrix : "); 
    scanf("%d", &m); 
    printf("Enter the no. of Columns of the first Matrix : "); 
    scanf("%d", &n); 

    printf("Enter the elements of the first matrix: \n"); 
    getMatrix(m, n, A); 
    printf("The entered Matrix:\n"); 
    displayMatrix(m, n, A); 
    printf("The transpose of the entered Matrix:\n"); 
    transposeMatrix(m, n, A); 

    printf("Enter the no. of Rows of the second Matrix : "); 
    scanf("%d", &p); 
    printf("Enter the no. of Columns of the second Matrix : "); 
    scanf("%d", &q); 

    printf("Enter the elements of the secong matrix: \n"); 
    getMatrix(p, q, B); 
    printf("The entered Matrix:\n"); 
    displayMatrix(p, q, B); 
    printf("The transpose of the entered Matrix:\n"); 
    transposeMatrix(p, q, B); 

    printf("Addition of the Matrices:\n"); 
    addMatrices(m, n, p, q, A, B); 
    printf("Multiplication of the Matrices:\n"); 
    multiplyMatrices(m, n, p, q, A, B); 

    return 0; 
} 

void getMatrix(int m, int n, int values[m][n]) 
{ 
    for(i = 0; i < m; ++i) 
    for(j = 0; j < n; ++j) 
     scanf("%d", &values[i][j]); 
} 

void displayMatrix(int m, int n, int values[m][n]) 
{ 
    for(i = 0; i < m; ++i) 
    { 
    for(j = 0; j < n; ++j) 
     printf("%3d ", values[i][j]); 

    printf("\n"); 
    } 
} 

void transposeMatrix(int m, int n, int values[m][n]) 
{ 
    int transpose[n][m]; 

    for(i = 0; i < n; ++i) 
    for(j =0; j < m; ++j) 
     transpose[i][j] = values[j][i]; 

    displayMatrix(n, m, transpose); 
} 

void addMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]) 
{ 
    int C[m][n]; 

    if(m == p && n == q) 
    { 
    for(i = 0; i < m; ++i) 
    for(j = 0; j < n; ++j) 
     C[i][j] = A[i][j] + B[i][j]; 

    displayMatrix(m, n, C); 
    } 
    else 
    printf("Cannot add these Matrices!\n"); 
} 

void multiplyMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]) 
{ 
    int C[m][q], k, sum = 0; 
    if(n == p) 
    { 
    for(i = 0; i < m; ++i) 
     for(j = 0; j < q; ++j) 
     { 
     for(k = 0; k < n; ++k) 
      sum += A[i][j] * B[j][i]; 

     C[i][j] = sum; 
     sum = 0; 
     } 

    displayMatrix(m, q, C); 
    } 
    else 
    printf("Cannot multiply these Matrices!\n"); 
} 
+0

@BLUEPIXY .: Sie sind so schnell ... aber ich antwortete fast zur gleichen Zeit – coderredoc

+0

Wie dieser Code Quelle mit auf der gleichen Linie zusammenstellen können 'int m, n, p, q, A [m] [n], B [p] [q]; '? Ohne auch zu warnen? –

Antwort

5

Initiliazie m und n, so dass Sie UB nicht bekommen, wenn sie in Array-Index in VLA verwenden.

Unsed Schleife in mehrfach Matrizen

for(k = 0; k < n; ++k) 
      sum += A[i][j] * B[j][i]; 

wird

for(k = 0; k < n; ++k) 
      sum += A[i][k] * B[k][j]; 

nicht globale Variablen verwenden Sie, wenn Sie brauchen. Es empfiehlt sich, Indexvariablen von for loop local zu erstellen.

for(int i=0;i<n;i++) 
... 
+0

aber wenn ich viele for-Schleifen innerhalb der gleichen Funktion verwenden müssen? Sollte ich noch üben, den Index lokal zu machen? –

+0

Es ist nicht gut, Globals für diese Variablen zu verwenden ... ja, du kannst natürlich ... aber es ist ziemlich schwer zu verfolgen. – coderredoc

+0

Sie sind sehr schnell zu beantworten! Schätze es wirklich... –