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 :

malloc() a l'aide d'une fonction + tab2D


Sujet :

C

  1. #1
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut malloc() a l'aide d'une fonction + tab2D
    je veus creer un tableau 2 dimensions dynamiquement, à l'aide de la focntion malloc... Mon code fonctionne très bien dans mon main() mais quand j'essaye de le mettre dans une fonctione creer_tab_dynamique, je n'y arrive pas.

    En voici mon code de mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    tab = malloc (nb_lig * sizeof (* tab));
     
    if (tab != NULL)
    {
       int i = 0;
       for (i = 0; i < nb_lig; i++)
       {
          tab[i] = malloc (nb_col * sizeof (**tab));
       }
    }
    NB: il manque la gestion si la 2eme allocation de la 2nd dimension a bien été réaliser ou non...
    Aussi, si la 2eme allocation dynamique échou, j'ai jsute besoin de libérer la 1ere allocation ? :

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Je ne vois pas de problème:
    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
    char ** creer_tab (size_t nb_lig, size_t nb_col)
    {
       char ** tab = malloc (nb_lig * sizeof (* tab));
     
       if (tab != NULL)
       {
          size_t i = 0;
          for (i = 0; i < nb_lig; i++)
          {
             tab[i] = malloc (nb_col * sizeof (**tab));
          }
       }
     
       return tab;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par nicodn02
    Aussi, si la 2eme allocation dynamique échou, j'ai jsute besoin de libérer la 1ere allocation ? :
    Non, pour chaque allocation dans ta boucle il faut un free, la règle en C est simple: 1 *alloc = 1 free

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (i = 0; i < nb_lig; i++)
    {
       if (tab[i] != NULL)
       {
          free (tab[i]);
       }
    }
    free (tab);
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    pourquoi as tu déclaré la fonction en tant que char ** creer_tab_dynamique ?
    ( ** )

    puis-je remplacer les size_t par des int ?

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par nicodn02
    pourquoi as tu déclaré la fonction en tant que char ** creer_tab_dynamique ?
    ( ** )
    Bin si tu veux un tableau de chaîne dynamique c'est un pointeur sur pointeur sur char qu'il te faut, comme il faut un pointeur sur char pour créer une chaîne dont l'espace est alloué dynamiquement ! Donc si tu veux retourner ce tableau de chaîne, c'est ainsi qu'il faut procéder

    Citation Envoyé par nicodn02
    puis-je remplacer les size_t par des int ?
    Non, il est préférable d'utiliser ce type pour les données de taille et d'index, c'est d'ailleurs le type attendu par malloc
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    De plus, après j'ai dautre fonction qui vont interagir avec le tableau, donc je ne voit pas comment faire dans mon main .... moi j'avais penser a :
    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
     
    int main(){
    /*Déclaration du tableau 2D */
    char ** tab = NULL;
    /*Déclaration des variables des dimensions */
    int nb_col=0, nb_lig=0;
     
    /*Demande des dimension a l'utilisateur */
    scanf("%d", &nb_col);
    scanf("%d", &nb_lig);
     
    /*Appel de la fonction pour creer le tableau */
    /* Je ne sais pas ici que marquer... j'orai penser a **tab=**creer_tab(nb_col, nb_lig); */
     
    initialisation_grille(tab, nb_col, nb_lig);
     
    draw_grille(tab, nb_col, nb_lig);
     
    ...
     
    return 0;
    }
    Mais je pense que mes initialisation_grille et draw_grille, il ne faut pas mettre dedans **tab ?( a la place de tab)


    les size_t fonctionne comme des int ?
    #include<stdlib.h> (malloc avec size_t et free a l'interieur de cette bibliotheque, non ? )

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bin fait simplement un appel du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = creer_tab_dynamique (nb_lig, nb_col);
    Tout simplement quoi
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    les size_t fonctionne comme des int ?
    Bin c'est un tout simplement, du moins suivant les implémentations je pense mais c'est le cas général me semble-t-il.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Et en ce qui concerne mes autres fonction, qui sont initalisation et draw, voici leur déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void initialisation_grille(char **grille, nb_lig, nb_col);
    void draw_grille(char **grille, nb_lig, nb_col);
    Est-ce bien cela?

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par nicodn02
    Et en ce qui concerne mes autres fonction, qui sont initalisation et draw, voici leur déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void initialisation_grille(char **grille, nb_lig, nb_col);
    void draw_grille(char **grille, nb_lig, nb_col);
    Est-ce bien cela?
    Tant que tu ne modifies pas la taille du tableau, cela ne devrait pas poser de problèmes particuliers.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Et en ce qui concerne maintenant les free
    on dit que la 1ere allocation échoue, je fait :
    et si la deuxieme allocation echou, je libere le tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    free(**tab);
    free(*tab);
    non?

  12. #12
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Non, je t'ai montré plus haut comment il faut procéder pour une libération correcte suivant ce type d'allocation !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  13. #13
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Donc meme si la 2eme allocation a echouer, il faut que je fasse comme si elle avait réussit et que je libere tout ?

  14. #14
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par nicodn02
    Donc meme si la 2eme allocation a echouer, il faut que je fasse comme si elle avait réussit et que je libere tout ?
    Bin si une seule allocation échoue, il faut de toute manière tout libérer sous peine d'avoir des comportements indéterminés par la suite dans l'exécution de ton programme. Ici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (i = 0; i < nb_lig; i++)
    {
       if (tab[i] != NULL)
       {
          free (tab[i]);
       }
    }
    free (tab);
    Je libère tout mais je test dans la boucle for à chaque itération si l'adresse courant est valide ou non, si elle l'est alors je la libère sinon je passe à la suivante. Ceci libère les espaces pour les chaînes de caractères dans ton tableau de chaînes. Une fois que la boucle est terminée, je libère le tableau lui même tout simplement.

    Il est préférable de procéder ainsi car une allocation peut très bien échouer en plein milieu du tableau !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  15. #15
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 15
    Dernier message: 26/03/2006, 12h10
  2. Aide pour une fonction
    Par mimi060101 dans le forum Scheme
    Réponses: 1
    Dernier message: 24/02/2006, 16h59
  3. Aide sur une fonction / pbm de manipulation de caractère
    Par captainamerica75 dans le forum Access
    Réponses: 3
    Dernier message: 16/02/2006, 11h54
  4. Regroupement de code à l'aide d'une fonction...
    Par JeremieT dans le forum Access
    Réponses: 6
    Dernier message: 09/01/2006, 10h53
  5. Besoin d'aide sur une fonction
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/08/2005, 17h40

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