void alloc_matrix(int ***mat,int *n,int *m)
Il y a deux problèmes dans cette ligne. Aucun n'est fatal mais les deux valent la peine d'être réparés.
Premier problème: Une matrice dans ce programme est représentée par int**
. Pourquoi alloc_matrix
accepte-t-il un int***
? Toutes les fonctions standard qui allouent quelque chose (malloc et amis) renvoient un pointeur sur ce quelque chose. C'est une façon idiomatique de faire les choses en C. Elle réduit votre nombre d'étoiles (être un programmeur C trois étoiles n'est pas une réalisation dont on peut être fier) et simplifie le code. La fonction doit être modifiée pour
int** alloc_matrix(// but what's inside the() ?
Le deuxième problème est, pourquoi une fonction appelée alloc_matrix
invite l'utilisateur et lire les valeurs? Ces choses ne sont pas liées à l'allocation. Une fonction devrait faire une chose et le faire bien. Est-ce que malloc
vous invite à entrer la taille? Est-ce que fopen
vous invite à entrer le nom de fichier? Ces choses seraient considérées comme un non-sens du premier degré, et à juste titre. Il est conseillé de lire les tailles ailleurs et de les passer à alloc_matrix
comme arguments d'entrée.Par conséquent,
int** alloc_matrix(int n, int m) { // but what's inside the {}?
Ce qui reste de alloc_matrix
est simple:
int** alloc_matrix(int n, int m) {
int** mat; // that's what we will return
int i;
mat = (int**)calloc(n, sizeof(int*));
for(i = 0; i < n; i++)
// here comes the important part.
Puisque nous avons alloc_matrix
simplifié et réduit le nombre d'étoiles à mat
, que devons-nous faire avec le vieux corps de la boucle? Il était:
*(mat+i) = (int*)calloc(...);
mais si on enlève une étoile, il devient
(mat+i) = (int*)calloc(...);
qui est un non-sens évident. Peut-être que la vieille ligne était un problème. Le fait qu'il ait provoqué un avertissement de compilateur ne justifie certainement pas son exactitude. Alors, comment le corriger? Il n'y a pas trop d'options. Il s'avère que pour restaurer la santé mentale, nous devons laisser l'ancienne partie gauche (écrite pour le trois étoiles mat
) intacte. Ou, mieux encore, utiliser une notation équivalente mais plus idiomatiques:
mat[i] = (int*)calloc(m, sizeof(int));
Ainsi, la fonction entière devient maintenant
int** alloc_matrix(int n, int m) {
int **mat;
int i;
mat = (int**)calloc(n, sizeof(int*));
for(i = 0; i < n; i++)
mat[i] = (int*)calloc(m, sizeof(int));
return mat;
}
et il devrait être appelé comme
mat = alloc_matrix(n, m);
On dit souvent que l'on ne devrait pas diffuser le résultat de calloc
et ses amis. Mais dans ce cas, la distribution a permis un avertissement qui a aidé à trouver un bug. Je laisse les moulages en place pour le moment.
Il n'y a pas de tableau 2D, ni de pointeur sur un ou quelque chose qui peut en représenter un! Et être un programmeur C 3 étoiles n'est pas un compliment. – Olaf
Si c'était votre code: veuillez ne pas corriger ses erreurs dans la question. Si ce n'est pas le cas, veuillez reporter l'ensemble de la question avec le code * réel *. –
'alloc_matrix (& mat, int & n, int &m);' ce n'est pas légal C. Quel compilateur utilisez-vous? –