Allocation memoire? Meilleur marche a suivre
Fermé
linquisiteur
-
27 févr. 2014 à 11:54
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 mars 2014 à 20:14
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 mars 2014 à 20:14
A voir également:
- Allocation memoire? Meilleur marche a suivre
- Meilleur site de telechargement - Accueil - Outils
- Meilleur mini pc - Accueil - Guide ordinateurs
- Meilleur site de vente entre particulier - Guide
- Mémoire vive - Guide
- Suivre colis - Guide
4 réponses
C'est vrai que c'est moins lisible, mais néanmoins c'est vitale car si ton ordinateur ne peut plus alloué de mémoire, ton programme risque également de segfault.
Pourquoi n'essaierai tu pas de te coder une fonction qui effectuerai un malloc, elle prendrai en paramètre la taille à allouer par exemple.
Ça rendrait ton code plus générique et plus lisible.
Pourquoi n'essaierai tu pas de te coder une fonction qui effectuerai un malloc, elle prendrai en paramètre la taille à allouer par exemple.
Ça rendrait ton code plus générique et plus lisible.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
27 févr. 2014 à 21:00
27 févr. 2014 à 21:00
Bonjour,
Le programme avec vérification n'est pas correct.
matriceA = malloc(...) => Il faut vérifier matriceA avant d'utiliser matriceA[k]
matrice[k]=malloc(...) => Il faut vérifier matrice[k] pour chaque k (donc dans la boucle for).
De même pour matriceB et matriceC.
Sinon oui, c'est vivement conseillé. Cela rend le programme plus robuste, plus facilement maintenable, etc.
Le programme avec vérification n'est pas correct.
matriceA = malloc(...) => Il faut vérifier matriceA avant d'utiliser matriceA[k]
matrice[k]=malloc(...) => Il faut vérifier matrice[k] pour chaque k (donc dans la boucle for).
De même pour matriceB et matriceC.
Sinon oui, c'est vivement conseillé. Cela rend le programme plus robuste, plus facilement maintenable, etc.
Merci a vous deux
Fiddy je dois aussi vérifier a chaque fois dans la boucle?
ex:
la sa devient très compliquer pour pas grand chose --'
Fiddy je dois aussi vérifier a chaque fois dans la boucle?
ex:
matriceA = malloc(sizeof *matriceA *n); if(matriceA != NULL){ int k, end = 0; for(k=0;k<n && end == 0;k++){ matriceA[k] = malloc(sizeof **matriceA * m); if(matriceA[k] != NULL){ k--; end = 1; for(;k>0;k--){ free(matriceA[k]); } free(matriceA); } ... }
la sa devient très compliquer pour pas grand chose --'
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
27 févr. 2014 à 22:46
27 févr. 2014 à 22:46
Oui, il faut le faire dans la boucle for.
Par exemple :
Ou comme dans ton code. Attention à bien traiter k=0 dans le dernier for.
la sa devient très compliquer pour pas grand chose --'
Eh oui, le C n'est pas un langage simple. Mais comme dit plus haut, le mieux est de faire des fonctions. Ainsi tu peux séparer le code fonctionnel du code technique.
Cdlt,
Par exemple :
end=0; matriceA = malloc(sizeof *matriceA *n); if(matriceA == NULL) return NULL; /*la fonction renvoie NULL*/ for(i=0;i<n && end ==0;k++){ matriceA[k] = malloc(sizeof **matriceA * m); if(matriceA[k] != NULL){ end=1; } } if(end==1) { for(j=0; j<i; j++) { free(matriceA[k]), matriceA[k]=NULL; } free(matriceA), matriceA=NULL; return NULL; } return matriceA;
Ou comme dans ton code. Attention à bien traiter k=0 dans le dernier for.
la sa devient très compliquer pour pas grand chose --'
Eh oui, le C n'est pas un langage simple. Mais comme dit plus haut, le mieux est de faire des fonctions. Ainsi tu peux séparer le code fonctionnel du code technique.
Cdlt,
Comment faire car ce code ne marche pas...
P.S j'ai refait vite un code car j'avais déjà tester sans succès ...
L'allocation ne se fait pas dans les procédure...
Que dois je faire?
merci
appel: allocMemoire(matriceA, n, m); void allocMemoire(**memoire, ligne, colonne){ matrice= malloc(sizeof *matrice *ligne); int k; for(k=0;k<n;k++) matrice[k] = malloc(sizeof **matrice * colonne); }
P.S j'ai refait vite un code car j'avais déjà tester sans succès ...
L'allocation ne se fait pas dans les procédure...
Que dois je faire?
merci
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
2 mars 2014 à 17:54
2 mars 2014 à 17:54
void allocMemoire(**memoire, ligne, colonne){
Faut mettre les types. char **memoire, int ligne, int colonne (ou autres)...
for(k=0;k<n;k++)
Que vaut n ? Il n'est pas connu dans la fonction. Il s'agit de ligne.
Sinon, si tu passes memoire en argument, il passait par un pointeur. Donc : char ***memoire. Et tu utilises (*memoire) partout où tu as utilisé memoire.
Ou sinon, le type devient : void *alloMemoire(const int ligne, const int colonne)
Et tu renvoie la variable memoire.
Cdlt,
Faut mettre les types. char **memoire, int ligne, int colonne (ou autres)...
for(k=0;k<n;k++)
Que vaut n ? Il n'est pas connu dans la fonction. Il s'agit de ligne.
Sinon, si tu passes memoire en argument, il passait par un pointeur. Donc : char ***memoire. Et tu utilises (*memoire) partout où tu as utilisé memoire.
Ou sinon, le type devient : void *alloMemoire(const int ligne, const int colonne)
Et tu renvoie la variable memoire.
Cdlt,
Désoler mais je ne comprend vraiment pas...
J'ai essayer cela mais j'ai des erreurs dans le compilateur:
ligne 18: note: expeced 'int ***' but argument is of type 'int **'
et avant les ; a ligne 137
J'ai essayer cela mais j'ai des erreurs dans le compilateur:
ligne 18: note: expeced 'int ***' but argument is of type 'int **'
et avant les ; a ligne 137
void allocationMemoire(int *** matrice, int ligne, int colonne){
matrice = (*matrice) malloc(sizeof *matrice *ligne);
int k;
for(k=0;k<ligne;k++)
matrice[k] = (*matrice) malloc(sizeof **matrice * colonne);
}
Je compile mais j'ai une erreur a l'exécution: "gmon.out: Too many open files"
je précise que je ne travaille avec aucun fichier ..
de plus mon programme ne fonctionne pas car rien qui est programmer de faire ne se fait je suppose donc que l'allocation a échouer et que le if matriceA == NULL a fait son boulot...
J'avoue être en train de légèrement cracker ^^' j'ai trouver aucune aide dans le livre du site du zéro et pas non plus dans le K&R ou sur des sites.
Ils expliquent souvent brièvement mais pas en profondeur :/
P.S pour info je vais remettre tout mon code:
je précise que je ne travaille avec aucun fichier ..
de plus mon programme ne fonctionne pas car rien qui est programmer de faire ne se fait je suppose donc que l'allocation a échouer et que le if matriceA == NULL a fait son boulot...
/* pré: int *** matrice est déclaré, ligne et colonne sont initialisées et > 0 post: ligne et colonne sont inchangés. matrice pointe sur un tableau de ligne * colonne avec une memoire allouée */ void allocationMemoire(int *** matrice, int ligne, int colonne){ puts("----1----"); matrice = malloc(ligne * sizeof(*matrice) ); int k; for(k=0;k<ligne;k++) (*matrice)[k] = malloc(colonne * sizeof(**matrice)); puts("----2----"); }
J'avoue être en train de légèrement cracker ^^' j'ai trouver aucune aide dans le livre du site du zéro et pas non plus dans le K&R ou sur des sites.
Ils expliquent souvent brièvement mais pas en profondeur :/
P.S pour info je vais remettre tout mon code:
#include <stdlib.h> #include <stdio.h> #include <time.h> /* time.h me permet de faire des nombres pseudo-aleatoire */ #include "matrice.h" /* inclusion du fichier matrice.h dans main.c */ void remplirTabAlea(int ** tab, int ligne, int colonne); void remplirTabManuel(int ** tab, int ligne, int colonne); void afficherTab(int ** tab, int ligne, int colonne); void allocationMemoire(int *** matrice, int ligne, int colonne); int main(void){ int n = 0, /* nombre de ligne de matriceA et matriceC */ m = 0, /* nombre de ligne de matriceB et colonne de matriceC */ l = 0; /* nombre de colonne de matriceB et matriceC */ do{ printf("Entre les valeur n, m, et l ou matrice A[n][m]; B[m][l]; C[n][l] et 0 < n,m,l < 16 \n"); scanf("%d %d %d",&n, &m, &l); }while(n<0 || n>15 || m<0 || m>15 || l<0 || l>15); /* Déclaration des matrices */ int **matriceA = NULL, **matriceB = NULL, **matriceC = NULL; /* allocation dynamique des lignes et des colonnes */ allocationMemoire(matriceA, n, m); int k; if(matriceA != NULL){ allocationMemoire(matriceB, m, l); if(matriceB != NULL){ allocationMemoire(matriceC, n, l); if(matriceC != NULL){ srand(time(NULL)); remplirTabAlea(matriceA, n, m); remplirTabAlea(matriceB, m, l); prod2matrices(matriceA, matriceB, matriceC, n, m, l); /* int compMat = compare2matrices(matriceA, matriceB, n, m, l); printf("Les 2 matrices sont %s",((compMat) ? "semblable" : "differente")); */ /* puts(""); puts(" MatriceA\n"); afficherTab(matriceA, n, m); puts("");*/ /*puissNmatrice(matriceA,matriceC, n, m, l,1);*/ puts("\n\n MatriceA \n"); afficherTab(matriceA, n, m); puts("\n\n MatriceB \n"); afficherTab(matriceB, m, l); puts("\n\n MatriceC \n"); afficherTab(matriceC, n, l); for(k=0;k<n;k++) /* Libération de la memoire allouer pour matriceC */ free(matriceC[k]); free(matriceC); } for(k=0;k<m;k++) /* Libération de la memoire allouer pour matriceB */ free(matriceB[k]); free(matriceB); } for(k=0;k<n;k++) /* Libération de la memoire allouer pour matriceA */ free(matriceA[k]); free(matriceA); } getchar(); return EXIT_SUCCESS ; } /* Cette procédure remplis des tableaux de nombre random(en l'occurence pour creer des matrices): pré: tab ** est déclarés, ligne et colonne sont initialisées et > 0 post: ligne et colonne sont inchangées, tab est initialisé resultat: tab à été initialisé de nombres */ void remplirTabAlea(int ** tab, int ligne, int colonne){ int i; for(i=0;i<ligne;i++){ int j; for(j=0;j<colonne;j++) tab[i][j] = rand() % 20; } } /* Cette procédure remplis des tableaux de nombre entrer par l'user(en l'occurence pour creer des matrices): pré: tab ** est déclarés, ligne et colonne sont initialisées et > 0 post: ligne et colonne sont inchangées, tab est initialisé resultat: tab à été initialisé de nombres */ void remplirTabManuel(int ** tab, int ligne, int colonne){ int i; for(i=0;i<ligne;i++){ int j; for(j=0;j<colonne;j++) scanf("%d",&tab[i][j]); } } /* pré: tab ** est déclarés et initialisé , ligne et colonne sont initialisées et > 0 post: ligne, colonne et tab sont inchangés resultat: le tableau à été afficher */ void afficherTab(int ** tab, int ligne, int colonne){ int i; for(i=0;i<ligne;i++){ int j; for(j=0;j<colonne;j++){ printf("%4d",tab[i][j]); } puts(""); } } /* pré: int *** matrice est déclaré, ligne et colonne sont initialisées et > 0 post: ligne et colonne sont inchangés. matrice pointe sur un tableau de ligne * colonne avec une memoire allouée */ void allocationMemoire(int *** matrice, int ligne, int colonne){ puts("----1----"); matrice = malloc(ligne * sizeof(*matrice) ); int k; for(k=0;k<ligne;k++) (*matrice)[k] = malloc(colonne * sizeof(**matrice)); puts("----2----"); }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
5 mars 2014 à 22:38
5 mars 2014 à 22:38
Quand, je disais de remplacer matrice par *matrice, c'était vraiment partout ;-)
Cela devrait donner :
Et pour l'appel :
Cela devrait donner :
void allocationMemoire(int *** matrice, int ligne, int colonne){ puts("----1----"); <gras>*matrice</gras> = malloc(ligne * sizeof(<gras>**matrice</gras>) ); int k; for(k=0;k<ligne;k++) (*matrice)[k] = malloc(colonne * sizeof(<gras>***matrice</gras>)); puts("----2----"); }
Et pour l'appel :
int **matrice; allocationMemoire(&matrice, ...);
merci tout fonctionne ^^
Et pour les free j'ai fais cela mais je préfère vérifier
Et pour les free j'ai fais cela mais je préfère vérifier
/* pré: int *** matrice possède un espace memoire allouer et colonne correspond au nombre de colonne du tableau post: colonne est inchangés. la memoire de matrice est désallouer */ void liberationMemoire(int *** matrice, int colonne){ int k; for(k=0;k<colonne;k++) /* Libération de la memoire allouer pour les matrices */ free((*matrice)[k]); free(*matrice); } //Avec pour appel liberationMemoire(&matriceA, m);
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
6 mars 2014 à 22:59
6 mars 2014 à 22:59
Pour les free, pas besoin de passer par un pointeur sur la matrice (sauf si tu souhaites faire comme je le recommande la mise des variables à NULL).
Donc, tu fais pareil, mais tu remplaces tout les *matrice par matrice.
Et pour appeler la fonction, tu mets matriceA au lieu de &matriceA.
Donc, tu fais pareil, mais tu remplaces tout les *matrice par matrice.
Et pour appeler la fonction, tu mets matriceA au lieu de &matriceA.
/* pré: int *** matrice possède un espace memoire allouer et colonne correspond au nombre de colonne du tableau post: colonne est inchangés. la memoire de matrice est désallouer */ void liberationMemoire(int *** matrice, int colonne){ int k; for(k=0;k<colonne;k++) /* Libération de la memoire allouer pour les matrices */ free(matrice[k]); free(matrice); }
***matrice en param est ok? Sinon merci encore vous m'aidez :)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
6 mars 2014 à 23:12
6 mars 2014 à 23:12
Non, tous ce qui est *matrice est à remplacer par matrice, y compris celui en param.
Donc : liberationMemoire(int **matrice, int colonne).
Au vu de la question, j'ai l'impression que tu fais ce qu'on te dit mais que tu ne comprends pas tout ? N'hésite pas à poser les questions...
Donc : liberationMemoire(int **matrice, int colonne).
Au vu de la question, j'ai l'impression que tu fais ce qu'on te dit mais que tu ne comprends pas tout ? N'hésite pas à poser les questions...
27 févr. 2014 à 22:39