Tristan Crolard - François Pottier
La définition suivante introduit un type matrix dont les dimensions sont données par deux constantes.
typedef double elt; #define ROWS 3 #define COLS 3 typedef struct { elt array[ROWS][COLS]; } matrix;
Écrire les fonctions dont voici les prototypes:
void identity (matrix* out_m); void transpose (matrix* inout_m); void add (matrix* in_m1, matrix* in_m2, matrix* out_m); void display (matrix* in_m);
Aurait-on pu écrire des variantes de la fonction add dotées des prototypes suivants?
void add (matrix in_m1, matrix in_m2, matrix* out_m); matrix add (matrix in_m1, matrix in_m2);En quoi est-ce différent? Justifier.
Écrire une fonction error qui affiche, sur stderr, un message passé en paramètre, puis stoppe l'exécution du programme avec le code de sortie 1.
On souhaite à présent manipuler au sein d'un même programme des matrices de taille arbitraire, aussi remplace-t-on la déclaration précédente par celle-ci:
typedef double elt; typedef struct { int rows, cols; elt* array; } matrix;On suppose (implicitement) que dans toute matrice m, le champ m.array pointe vers un tableau de taille
Écrire les fonctions de lecture et d'écriture dans une case de la matrice:
elt value (matrix* in_m, int row, int col); void assign (matrix* out_m, int row, int col, elt e);Ces fonctions devront vérifier, au passage, que les indices fournis en paramètres sont valides.
Utiliser ces fonctions pour réimplanter les opérations de la première question.