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 :

passer un tableau issu d'un malloc a une fonction


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Points : 42
    Points
    42
    Par défaut passer un tableau issu d'un malloc a une fonction
    Salut !

    Sauriez vous (je n'en doute pas :p) comment passer un tableau issu d'un malloc a une fonction ? (et utilisable come tel dedans)

    merci beaucoup, ++ Tix.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Typiquement, on le passe en tant que pointeur_vers_le_premier_élément + taille_en_elements.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    EDIT: ok, j'ai rien dit, voir juste au-dessus et juste en-dessous

    Qu'est-ce qu'un tableau ?
    Un tableau est un pointeur constant pointant sur le premier élément du tableau. Donc tout ce que tu as à faire, c'est passer le tableau tel quel, sans autre modification:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /* Fonction utilisant le tableau */
    void foo(int* tab)
    {
       tab[0] = 3; /* Exemple d'utilisation du tableau */
    }
     
    /* Appel de la fonction */
    int* tab = malloc(sizeof(int)*taille);
    foo(tab);

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Perdu.
    Un tableau est un tableau. Mais il y a une conversion implicite entre un tableau et un pointeur vers son premier élément.
    Et tu n'as pas passé la taille.

    Code C : 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
    /* Fonction utilisant le tableau */
    void foo(int* tab, size_t taille)
    {
       size_t i;
       for(i=0 ; i<taille ; i++)
       {
       tab[i] = 42;
       }
    }
     
    /* Allocation */
    int* tab = malloc(sizeof(*tab) * taille_voulue);
    /* Ici, tab est un pointeur vers le premier élément tu tableau.
        Mais tab N'EST PAS un tableau, ni un pointeur sur tableau! */
     
    foo(tab, taille_voulue);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut Re:
    Déclare un tableau de 10 entiers : t
    Les 10 éléments de ce tableau sont : t[0], t[1], ... t[9]

    t, t tout court, pointe sur le premier élément du tableau (t ) à savoir : t[0]. Autrement dit : t <=> &(t[0]). t est donc un pointeur, mais un pointeur constant et pour être plus précis un pointeur constant vers t[0]. De même : t + 1 <=> &(t[1]) et ainsi de suite.

    Donc pour passer un taleau en argument d'une fonction, pour retourner un tableau, etc. on passe (ou retourne ...) simplement un pointeur sur le premier élément.

    Remarques :
    Etant donné un tableau t, sizeof(t) vaut le nombre d'éléments du tableau * la taille d'un élément. Donc pour connaître le nombre d'éléments de t on peut faire par exemple : . Cependant ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    size_t Taille(int * p)
    {
        return sizeof(p);
    }
    Taille(t) ne retournera pas sizeof(t) mais ... sizeof(int *). En effet p est une variable locale à Taille qui est de type int *. Donc fais gaffe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void TraiterTableau(int * p, size_t taille);

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Melem
    Déclare un tableau de 10 entiers : t
    Les 10 éléments de ce tableau sont : t[0], t[1], ... t[9]
    Oui.
    t, t tout court, pointe sur le premier élément du tableau (t ) à savoir : t[0]. Autrement dit : t <=> &(t[0]). t est donc un pointeur, mais un pointeur constant et pour être plus précis un pointeur constant vers t[0]. De même : t + 1 <=> &(t[1]) et ainsi de suite.
    Non : t n'est pas un "pointeur constant", et n'a pas le type pointeur. t est un tableau et possède le type "tableau de 10 int", c'est tout.
    Néanmoins, t est implicitement convertible en pointeur vers son premier élément.

    Cela est mis en évidence par du code ainsi fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void UneFonction(int (*pTab)[10])
    {
    }
    void UneAutreFonction(int **pTab)
    {
    }
    void TestArray3(void)
    {
    	int tab[10];
    	UneFonction(&tab);
    	UneAutreFonction(&tab); /* ne compile pas. */
    }
    Le reste est OK.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre du Club
    Profil pro
    Lycéen
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Points : 42
    Points
    42
    Par défaut
    merci beaucoup !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/03/2008, 18h28
  2. Réponses: 8
    Dernier message: 22/12/2006, 22h36
  3. Malloc par une fonction
    Par firejocker dans le forum C
    Réponses: 4
    Dernier message: 12/05/2006, 13h08
  4. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00
  5. Créer un tableau lors de l'appel d'une fonction
    Par MiJack dans le forum Langage
    Réponses: 11
    Dernier message: 01/02/2006, 11h18

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