IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

[Debutant] Matrice dynamique


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut [Debutant] Matrice dynamique
    Bonsoir,

    Voilà, j'essaie de crée une matrice dynamique, pour celà j'utilise plusieurs fonctions. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    void supprimer_mat(char** mat, int c) {
    	for(int i=0; i<c; i++) 
    		delete mat[i]; 
    	delete [] mat; 
    }
     
    void creer_mat(char** mat, int c, int l) {
    	mat = new char* [c];
    	for (int i=0; i<c; ++i)
    		mat[i] = new char[l];
    }
     
    void charge(int& l, int &c, char** mat) {
            l=10, c=15;
    	creer_mat(mat, c, l);
     
    	for (int i=0; i<c; ++i)
    		for (int j=0; j<l; ++j) 
    			mat[i][j] = 'a';
    }
     
    int main() {
    	int l,c;
    	char** mat = NULL;
     
    	charge(l, c, mat);
    }
    Cependant il me met une erreur de segmentation (core dump).

    Avez-vous une idée d'où cela puisse venir ?

    Merci d'avance.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonsoir,
    il y as deux erreurs dans ton code (de ce que j'ai vu).
    1- Tu a une fuite mémoire dans la fonction supprimer. Tu ne supprime pas les tableaux de char indexé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void supprimer_mat(char** mat, int c) {
    	for(int i=0; i<c; i++) 
    		delete [] mat[i]; 
    	delete [] mat; 
    }
    2- tu ne recupère pas ton tableau crée par creer_mat.
    Tu passe par copie un char**. Tu le modifie dans la fonction, mais comme c'est une copie, ben tu ne récupère pas cette valeur hors de la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void creer_mat(char** &mat, int c, int l) {
    	mat = new char* [c];
    	for (int i=0; i<c; ++i)
    		mat[i] = new char[l];
    }
    Si tu ne comprend pas ces deux erreur n'hésite pas de poser la question. Tout de même un conseil :
    utilise un vector 1D de taille c*l. Et accède à tes éléments en recalculant l'index 2D en index 1D par : i*c+j;
    Ou encore mieux fait un class matrice, ou utilise une lib


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void charge(int& l, int &c, std::vector<char> & mat) {
            l=10, c=15;
    	mat.resize(l*c);
     
    	for (int i=0; i<c; ++i)
    		for (int j=0; j<l; ++j) 
    			mat[i*c+j] = 'a';
    }
     
    int main() {
    	int l,c;
    	std::vector<char>  mat ;
     
    	charge(l, c, mat);
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Tout d'abord merci de ta rapidité.

    Enfait, je ne peux pas utiliser les vector de la stl, je dois tout faire moi-même.

    Cependant, je ne comprends pas pourquoi il vaut mieux utiliser un vecteur 1D et calculer les éléments de la manière dont tu m'as expliqué. En quoi est-ce plus efficace ?

    Merci.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Points : 201
    Points
    201
    Par défaut
    Je sais pas si ca peut te donner des idées....

    http://www.developpez.net/forums/sho...48&postcount=3

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Merci, mais je ne comprends toujours pas l'intérêt d'utiliser i*c+j pour accéder aux éléments. Est-ce que ça prend moins de place en mémoire ?

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par herlock Voir le message
    Cependant, je ne comprends pas pourquoi il vaut mieux utiliser un vecteur 1D et calculer les éléments de la manière dont tu m'as expliqué. En quoi est-ce plus efficace ?
    Salut,
    je vais te donner celle que je connaît :

    • simplifie la gestion de la mémoire
    • tu peut accéder à tout les elements avec une seul boucle => plus rapide pour des traitement indépendant de sa position comme l'initialisation
    • Il est toujours préférable pour des performance d'avoir les donné contiguë en mémoire. Faire un tableau 2D oblige le processeur a charger plusieurs bout de mémoire qui se situe a diverse endroit. Alors qu'un tableau 1D il va pourvoir charger une bonne partie en un coup. => plus rapide en accés memoirre et donc en performance globale

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Ok, donc en gros on utilise jamais de matrice ?

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par herlock Voir le message
    Ok, donc en gros on utilise jamais de matrice ?
    Si, mais sous forme 1D . Enfin engénérale. C'est juste une représentation différente. après c'est au choix de chaqu'un.

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Ok !

    Ben merci pour toutes vos réponses :-)

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Implémenter une matrice comme un tableau de tableaux, c'est pas vraiment une bonne idée.

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/12/2006, 21h56
  2. [DEBUTANT] Matrice en java
    Par Mehdi_82 dans le forum Langage
    Réponses: 1
    Dernier message: 26/08/2006, 21h11
  3. [Struts-Layout][debutant] Crumbs dynamique
    Par radoine dans le forum Struts 1
    Réponses: 3
    Dernier message: 20/07/2006, 14h56
  4. [Débutant] Champs dynamiques d'un formulaire
    Par syntiz dans le forum Struts 1
    Réponses: 2
    Dernier message: 28/06/2006, 14h57
  5. Réponses: 13
    Dernier message: 13/07/2004, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo