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 :

Allocation dynamique d'un tableau de pointeurs vers une structure


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Allocation dynamique d'un tableau de pointeurs vers une structure
    Bonjour, je cherche à allouer dynamiquement un tableau de pointeurs vers une structure. J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct test{
     int x;
     int y;
    } test;
    …
    test *tab[taille];
    tab = malloc(taille * sizeof(*test));
    …
    mais à la compilation, j'obtiens les erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parse error before 'test'
    incompatible types in assignment
    Merci de votre aide.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    normal

    quand tu fais un "typedef struct" le premier nom à apparaître après est le pointeur sur la structure, celui après est le nom de la structure...

    Donc là tu as le même nom pour désigner le pointeur ET la structure.

    En général, tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct Ptrtest{
     int x;
     int y;
    } test;
    …
    Ensuite moi ce que je ferais est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test *tab=NULL;
     
    tab = malloc(taille * sizeof(test));
    Si c'est bien ça que tu veux faire (un tableau de structures)

    Si c'est un tableau de pointeurs vers des structures, alors c'est différent...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  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 : 46
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut et bienvenue sur les forums de developpez.com


    Ce que tu as fait n'as aucun sens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test *tab[taille];
    tab = malloc(taille * sizeof(*test));
    car
    est déjà un tableau de pointeur !

    Si tu veux juste faire ceci en allocation dynamique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test ** tab = NULL;
    ...
    tab = malloc (taille * sizeof (* tab));
    Mais il faut choisir, c'est soit l'allocation dynamique ou un tableau statique mais en aucun cas les deux !
    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
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Spootnik
    Lorsque tu définis ta structure, tu écris test avant OU après selon le cas, mais pas les deux en même temps
    NON tu peux...

    voir au dessus ;-)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    Citation Envoyé par souviron34
    NON tu peux...

    voir au dessus ;-)
    oui j'ai vu après coup, et puis 3 fois des réponses à peu près équivalentes ne servent pas à grand chose, d'où la supression de mon post.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour vos réponses. Vous êtes sympa. Tout marche.

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par souviron34
    quand tu fais un "typedef struct" le premier nom à apparaître après est le pointeur sur la structure
    Ce n'est pas un pointeur au sens C du terme.

    Citation Envoyé par souviron34
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct Ptrtest{
     int x;
     int y;
    } test;
    …
    Tout a fait, meme si dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct{
     int x;
     int y;
    } test;
    suffit.

    Citation Envoyé par souviron34
    Ensuite moi ce que je ferais est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test *tab=NULL;
     
    tab = malloc(taille * sizeof(test));
    Ca fonctionne parfaitment comme ca, mais personnellement j'ai plutot tendance a ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    test *tab=NULL;
     
    tab = malloc(taille * sizeof *tab);
    Ainsi, si un jour le type de tab change, il n'y a pas de modification a faire dans le malloc, d'ou une maintenance du code facilite.

    Dans ce cas de figure ou l'allocation suit immediatement la definition, j'aurais meme plutot tendance a ecrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test *tab = malloc(taille * sizeof(test));

  8. #8
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par souviron34
    normal

    quand tu fais un "typedef struct" le premier nom à apparaître après est le pointeur sur la structure, celui après est le nom de la structure...
    L'erreur de compilation ne vient pas de là. La définition de sa structure est correct.
    Le problème vient de la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = malloc(taille * sizeof(*test));
    qui n'a aucun sens.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par gl
    Ce n'est pas un pointeur au sens C du terme.
    si si c'est un pointeur au sens C du terme...

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct  Ptr_MaStruct {
     
        int toto ;
     
        Ptr_MaStruct previous ;
        Ptr_MaStruct next ;
     
    } MaStruct ;
    crocodilex t'étais pas réveillé c'est bien ce qu'il avait marqué
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    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
    Si si, gl a raison, et ce que tu viens de poster ne compilera pas.
    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.

  11. #11
    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
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct st_maStruct MASTRUCT, *PMASTRUCT;
    typedef const struct st_maStruct *PCMASTRUCT;
     
    struct st_maStruct
    {
    	int toto;
    	PMASTRUCT pPrev;
    	PMASTRUCT pNext;
    };
    Ici, PMASTRUCT est un type pointeur (et non un pointeur lui-même). Par contre, pPrev et pNext sont des pointeurs.
    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.

  12. #12
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par souviron34
    crocodilex t'étais pas réveillé c'est bien ce qu'il avait marqué
    C'est qui "il" ?
    Peut etre que tu n'as pas bien compris ou bien lu mon post !!!
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Crocodilex a écrit :

    C'est qui "il" ?
    iPote puisque c'était bien à son code que tu faisais réference quand tu as écrit :

    La définition de sa structure
    non ?

    Médinoc a écrit :

    Si si, gl a raison, et ce que tu viens de poster ne compilera pas.
    bien sûr que si.. Je l'utilise partout dans mes codes..

    voir

    http://vergil.chemistry.gatech.edu/r...l/structs.html
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct  Ptr_MaStruct {
     
        int toto ;
     
        Ptr_MaStruct previous ;
        Ptr_MaStruct next ;
     
    } MaStruct ;
    Ici, le type Ptr_MaStruct n'est pas définit. En tout cas, mon compilateur me raconte pleins de choses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct  Ptr_MaStruct {
     
        int toto ;
     
        struct Ptr_MaStruct previous ;
        struct Ptr_MaStruct next ;
     
    } MaStruct ;
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    eh bien écoute je ne sais que te dire...

    Moi j'utilises ça depuis plus de 11 ans sur HPUX, SGI Unix, Linux (redhat), et ça marche parfaitement....

    Exemple pour de la triangulation :

    typedef struct _Triangle {

    int S1 ;
    int S2 ;
    int S3 ;

    struct _Triangle *next ;
    struct _Triangle *previous ;

    } Triangle ;
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  16. #16
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34
    eh bien écoute je ne sais que te dire...

    Moi j'utilises ça depuis plus de 11 ans sur HPUX, SGI Unix, Linux (redhat), et ça marche parfaitement....

    Exemple pour de la triangulation :
    Là, c'est OK, mais ce n'est pas ce que tu as écris plus haut...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    mujigka a écrit :

    Là, c'est OK, mais ce n'est pas ce que tu as écris plus haut...
    oooopppppssss t'as raison... je devais m'endormir... milles excuses...

    Ce que je voulais dire c'est que le nom avant désigne le pointeur sur la structure, et que donc on peut s'en servir directement.. Si il n'y a pas de nom après, ça désigne la structure. Si il y a un nom avant ça désigne donc le pointeur sur la structure, et (contrairement à beaucoup de cours que j'ai vu sur le net) que du coup il vaut mieux lui donner un nom différent... (Ptr_Struct ou _Struct)..

    Désolé encore...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  18. #18
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par souviron34
    [...]Si il y a un nom avant ça désigne donc le pointeur sur la structure,[...]
    T'as vu ça où ? J'espère que ce n'est pas dans un bouquin qui traite du langage C.....
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    reprenons calmement l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct _Triangle {
     
    int S1 ;
    int S2 ;
    int S3 ;
     
    struct _Triangle *next ;
    struct _Triangle *previous ;
     
    } Triangle
    Si maintenant je veux créer un élément, je vais pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct _Triangle *MonTriangle=NULL ;
    
    MonTriangle = calloc ( 1, sizeof(_Triangle) ;
    Mais par contre je vais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct Triangle *MonTriangle=NULL ;
     
    MonTriangle = calloc ( 1, sizeof(Triangle) ;
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  20. #20
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Je trouve cette écriture assez douteuse :
    Citation Envoyé par souviron34
    Mais par contre je vais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct _Triangle { 
       int S1 ;
       int S2 ;
       int S3 ; 
       struct _Triangle *next ;
       struct _Triangle *previous ; 
    } Triangle; 
     
    struct Triangle *MonTriangle=NULL ;
     
    MonTriangle = calloc ( 1, sizeof(Triangle) ;
    Bizarre ton truc.

    Moi je ferais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Triangle *MonTriangle=NULL ;
    MonTriangle = calloc ( 1, sizeof *MonTriangle ) ;
    ou bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    struct _Triangle *MonTriangle=NULL ;
    MonTriangle = calloc ( 1, sizeof *MonTriangle);
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

Discussions similaires

  1. Allocation dynamique d'un tableau de pointeur
    Par Général03 dans le forum Débuter
    Réponses: 20
    Dernier message: 09/12/2009, 18h21
  2. Réponses: 11
    Dernier message: 18/08/2008, 16h38
  3. allocation dynamique d'un tableau de pointeurs
    Par Dilettante dans le forum C++
    Réponses: 9
    Dernier message: 29/06/2007, 23h41
  4. Réponses: 13
    Dernier message: 01/10/2006, 00h25
  5. pointeur vers une structure
    Par Xyrroa dans le forum C
    Réponses: 14
    Dernier message: 12/04/2006, 13h13

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