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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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