2017-02-17 2 views
0

J'ai écrit un code C pour le fonctionnement de la matrice. Les valeurs des lignes et des colonnes doivent être définies par l'utilisateur. Lorsque j'essaie d'exécuter le code, une fenêtre apparaît affichant "matrix_addition.exe has stopped working". Pourquoi est-ce vrai? Lors de la construction du code, il n'y a pas d'erreur.ne peut pas exécuter l'opération de matrice programme C dans les blocs de code

#include <stdio.h> 
int main() 
{ 
    int r,c,i,j,a_matrix[r][c],b_matrix[r][c]; 
    printf("Enter the number of rows and columns of matrix\n"); 
    scanf("%d %d", &r, &c); 

    printf("enter the elements of the first matrix \n"); 
    for(i=0;i<r;i++) 
    { 
     for(j=0;j<c;j++) 
     { 
      printf("a_matrix[%d][%d]:",i,j); 
      scanf("%d",&a_matrix[i][j]); //array input 
     } 
    } 

    printf("\n enter the elements of the second matrix \n"); 
    for(i=0;i<r;i++) 
    { 
     for(j=0;j<c;j++) 
     { 
      printf("b_matrix[%d][%d]:",i,j); 
      scanf("%d",&b_matrix[i][j]); //array input 
     } 
    } 
    return 0; 
} 

Veuillez voir l'image ci-jointe de la fenêtre d'erreur. enter image description here

+1

Vous attendiez-vous '' a_matrix' et b_matrix' à se développer comme par magie à la bonne taille une fois '' r' et c' ont été assignés des valeurs valides? Ce n'est pas comme ça que C fonctionne, en général. – unwind

+0

pour faciliter la lisibilité et la compréhension: 1) suivre l'axiome: * une seule déclaration par ligne et (au plus) une déclaration variable par déclaration. * 2) les noms de variables doivent indiquer «contenu» ou «usage» (ou mieux,). – user3629249

+0

les valeurs de la variable 'r' et' c' doivent être assignées avant de les utiliser pour déclarer les tableaux: 'a_matrix [r] [c]' et 'b_matrix [r] [c]' <- c'est le principal problème avec le code – user3629249

Répondre

3

Votre programme utilise des matrices de longueur variable. Mais il les initialise avec des variables qui ont des valeurs non spécifiées. Le comportement de votre programme n'est pas défini, et vous avez de la chance qu'il se soit écrasé au lieu de sembler fonctionner.

int r,c,i,j,a_matrix[r][c],b_matrix[r][c]; 
    ^
    unspecified value used to initialize the sizes of a_matrix and b_matrix 

La solution immédiate est de déplacer simplement les définitions de la matrice après avoir obtenu l'entrée d'utilisateur:

int r,c,i,j; 
printf("Enter the number of rows and columns of matrix\n"); 
scanf("%d %d", &r, &c); 

int a_matrix[r][c], b_matrix[r][c]; 

VLA ont été présentés par C99, et une autre fonctionnalité introduite avec cette norme est la possibilité de définir des variables partout dans une portée de bloc, pas seulement le début. En fait, vous devriez vous efforcer de définir des variables aussi proches que possible de leur point d'utilisation initial. IMO qui rend le code beaucoup plus clair à lire que de les avoir tous regroupés au début d'une fonction.


Je serais négligent si je ne vous avais pas averti que l'utilisation de VLA court un certain risque. La plupart des implémentations modernes du langage C utilisent une pile d'appels qui contient des variables de fonctions pendant l'exécution. Cette pile d'appels est assez limitée en taille, et si vous définissez une très grande VLA dessus, votre programme débordera la pile et se terminera immédiatement.

1

Vous invoquez comportement non défini que vous définissez deux tableaux de longueur variable, mais les initialiser avec des variables vous n'avez pas encore pris en entrée, ainsi leurs valeurs ne sont pas spécifiées.

Vous pouvez déplacer la déclaration de vos tableaux exactement après le point où vous avez lu leur taille. Donc changer cette partie:

int r,c,i,j,a_matrix[r][c],b_matrix[r][c]; 
printf("Enter the number of rows and columns of matrix\n"); 
scanf("%d %d", &r, &c); 

à:

int r,c,i,j; 
printf("Enter the number of rows and columns of matrix\n"); 
scanf("%d %d", &r, &c); 
int a_matrix[r][c], b_matrix[r][c];