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 :

Tentative de libération de matrice


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Tentative de libération de matrice
    Bonjour!

    Je me suis récemment lancé dans le C et me voilà avec un problème qui doit certainement avoir une solution simple.
    J'ai créé une matrice(**matrice) et je veux la libérer. J'ai vu que pour ce faire il fallait libérer comme on avait alloué et j'ai suivi deux exemples qui libéraient de la même façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for ( i = 0 ; i < n ; i++ )
    	free(matrice[i]);
     
    free(matrice);
    J'ai donc utilisé cette façon de faire(qui me semblait logique). J'ai compilé sans erreur ni warning et j'ai lancé l'application. Mais celle-ci s'est terminée avec un code d'erreur. En chipottant, j'ai découvert que c'était en rapport avec les free() libérant la matrice. Et je ne comprends pas où se situe le problème.

    Je vous mets mon code perso avec la création de la matrice ci-dessous.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    // variables
    long largeur = 0, hauteur = 0;   // deviendront largueur=7 et longueur=6
    char ligne[50];
    int i=0, j=0;
     
    // vars pour allocation dynamique
    char **level;		// matrice à deux dimensions
     
     
    ( ... )
     
    // CREATION DE LA MATRICE RECEVANT LE NIVEAU
    // Création des cases en Y
    level = malloc (hauteur * sizeof(char*));	// initialise des pointeurs vides
    if (level == NULL)
    {
    	fprintf(stderr,"Impossible d'allouer la mémoire level (en Y)");
    	exit(EXIT_FAILURE);
    }
     
    // Création des cases en X
    for (i=0;i<largeur;i++)
    {
    	level[i] = calloc(largeur, sizeof(char));	// calloc initialise les pointeurs à la valeur NULL
    	if (level[i] == NULL)
    	{
    		fprintf(stderr,"Impossible d'allouer la mémoire level[i] (en X)");
    		exit(EXIT_FAILURE);
    	}
    }
     
    ( ... )
     
    // LIBERATION DE LA MATRICE LEVEL
    for ( i = 0 ; i < hauteur ; i++ )
    	free(level[i]);
     
    free(level);

    D'avance merci pour vos conseils!

    Cédric

    PS: Je ne sais pas si ça a son importance, mais j'utilise Code::Block avec la lib SDL pour cette application

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Spikeuh
    J'ai donc utilisé cette façon de faire(qui me semblait logique). J'ai compilé sans erreur ni warning et j'ai lancé l'application. Mais celle-ci s'est terminée avec un code d'erreur. En chipottant, j'ai découvert que c'était en rapport avec les free() libérant la matrice. Et je ne comprends pas où se situe le problème.
    Ce code est incomplet. Il n'est pas testable dans l'état.

    Ceci est incorrect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* Création des cases en X */
       for (i = 0; i < largeur; i++)
       {
    C'est 'hauteur' et non 'largeur'.

    Ce code est correct :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
    /* variables */
       long largeur = 0, hauteur = 0;
       int i = 0;
     
    /* vars pour allocation dynamique */
    /* matrice à deux dimensions */
       char **level;
     
       largeur = 7;
       hauteur = 6;
     
    /* CREATION DE LA MATRICE RECEVANT LE NIVEAU */
    /* Création des cases en Y */
    /* initialise des pointeurs vides */
       level = malloc (hauteur * sizeof (char *));
       if (level == NULL)
       {
          fprintf (stderr, "Impossible d'allouer la mémoire level (en Y)");
          exit (EXIT_FAILURE);
       }
     
    /* Création des cases en X */
       for (i = 0; i < hauteur; i++)
       {
    /* calloc initialise les pointeurs à la valeur NULL */
          level[i] = calloc (largeur, sizeof (char));
          if (level[i] == NULL)
          {
             fprintf (stderr, "Impossible d'allouer la mémoire level[i] (en X)");
             exit (EXIT_FAILURE);
          }
       }
     
    /* LIBERATION DE LA MATRICE LEVEL */
       for (i = 0; i < hauteur; i++)
          free (level[i]);
     
       free (level);
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Oups!! Mince j'aurais dû le voir, mais je pensais que j'avais fait une erreur dans la syntaxe et non en intervertissant deux variables...

    Merci pour le coup de main!

    Et je mettrai un code complet pour la prochaine fois!

    Ca m'encouragera à envisager d'autres possibilités avant de poster pour une bêtise...

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Je viens ajouter une petite remarque sur l'allocation de matrices.
    Allouer une hauteur, puis allouer chaque ligne séparément fait appelle à de nombreux malloc. Qui sont gourmand en temps, et sont de plus source d'erreur.

    Dans le cas de matrices de grande taille, il peut être plus judicieux d'allouer un seul tableau suffisament grand pour contenir toute la matrice, puis allouer un tableau d'une taille égale au nombre de ligne, et y stocker les pointeurs vers les cases de la matrice correspondants aux débuts de lignes.

    J'espère avoir été assez clair

    Voici un exemple pour une matrice de char :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int largeur = 50;
    int hauteur = 100;
     
    char *data = malloc(hauteur * largeur * sizeof(char));
    char** matrice = malloc(hauteur * sizeof(char*));
     
    for(int i=0; i<hauteur; i++)
        matrice[i] = &(data[i*largeur]);

    Voila, en principe ça fonctionne

    Xtatic.

Discussions similaires

  1. matrices * vecteur
    Par delire8 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 07/09/2002, 14h15
  2. [CR] entête et pied sur page 1/B de matrice
    Par chloe.j3 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 04/09/2002, 12h07
  3. Matrice de filtrage ?
    Par gimlithedwarf dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 24/08/2002, 09h44
  4. Gestion de matrice
    Par bzd dans le forum C
    Réponses: 4
    Dernier message: 12/08/2002, 18h19
  5. Comment définir le type matrice ?
    Par charly dans le forum Langage
    Réponses: 7
    Dernier message: 15/06/2002, 21h01

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