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 :

comment définir une structure contenant un tableau dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut comment définir une structure contenant un tableau dynamique
    Bonjour,
    Je souhaiterais définir une structure de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct bar {
      int h[90];
      int v[90];
    };
    mais où le 90 peut être modifié dans le programme. J'ai donc cherché dans les différents tutoriels et cours, et si j'ai vu plus de 1000 exemples pour faire un tableau dynamique de structure, je n'en ai pas trouvé un seul montrant comment faire une structure de tableaux dynamique (tous les exemples sont avec des chaînes de caractères type "papiers d'identité", mais les tableaux ne sont jamais dynamiques)

    J'ai donc essayé moi-même, mais je n'ai jamais réussi... Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct bar {
      int *h;
      int *v;
    };
    passe bien à la compilation, mais je ne comprends pas comment lui indiquer la taille Nmax des tableaux h et v que je connais et qui seront toujours les mêmes : si je le fais à la main avec un malloc/calloc, je n'arrive pas à accéder aux valeurs bar.h[10] par exemple...

    Question subsidiaire : au niveau des performances, est-il plus intéressant d'utiliser une structure de ce type ou de tout réunir dans un tableau dynamique 2 fois plus grand (ce que je sais faire, par contre) et d'ajouter à chaque fois Nmax à l'indice pour accéder aux seconds éléments de la structure ? (mais même si c'est le cas, j'aimerais pour ma culture personnelle comprendre la première question)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 151
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    puisqu'il s'agit de tableaux dynamique, dans une structure ou non, oui il faudra les allouer avec malloc.
    En général, on stocke aussi dans la structure la taille des tableaux, souvent nécessaire pour les traitements.

    As-tu déjà réalisé un tableau dynamique en dehors d'une structure ? Si oui, la difficulté est identique. Il n'y a que son accès qui est à peine modifié:
    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
     
    struct bar { 
      int* h;
      int hSize;
    };
    int main()
    {
       // int* h;
       struct bar b;
       // h = (int*)malloc(10*sizeof(int));
       b.h = (int*)malloc(10*sizeof(int));
       b.hSize = 10;
     
       b.h[10] = 10;
       printf("%i", b.h[10]);
     
       // free(h);
       free(b.h);
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut
    Merci de la réponse. Oui, je sais créer un tableau dynamique et l'utiliser.

    Le code que vous me proposez est exactement celui que j'avais fait (c'est ce que j'indiquais dans la seconde partie de mon premier post) : je faisais exactement comme pour un tableau dynamique classique. Mais code::blocks me renvoie cela à la compilation :
    C\user\... | 32 | error:expected constructor, destructor, or type conversion before '.' token
    Et la ligne 32 du fichier correspond à la réservation de la mémoire :
    barri.h = (int*)malloc(90*sizeof(int));
    C'est donc exactement pour cela que je demande de l'aide, car je ne comprends pas ce qui manque dans le code....

    EDIT : si j'inverse les deux lignes de commande, j'ai la même erreur (toujours en ligne 32) :
    barri.hsize = 90;

  4. #4
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut
    Bonjour elligain

    j'ai compilé ton code sous BCC , et j'ai 0 warning, 0 errors

    peut être que cela viens de ta chaine d'outil uniquement.
    Page sur Developpez : http://pbriand.developpez.com

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut
    Oups.... je viens de comprendre !
    C'est que je testais le code en dehors de la fonction de test (erreur simplement de place dans l'accolade) .... Bref, c'est de ma faute si cela ne marchait pas. Encore désolé. Et merci pour la réponse.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut
    Bonjour,

    je n'arrive pas à comprendre le role du (int*) dans la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       b.h = (int*)malloc(10*sizeof(int));
    Suis également intéressé par faire une structure avec des tableaux dynamiques (je tâtonne pour le moment) alors je m'inspire ...

    Bises,
    M.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    je n'arrive pas à comprendre le role du (int*) dans la ligne:
    C'est l'opérateur de cast (transtypage)
    Ici, il ne sert à rien en C.
    malloc() renvoie une adresse du type void* et en C, le transtypage de void * en un autre type d'adresse (ici int * , le type de b.h) est automatique.

    Cela dit certains sont pour le mettre quand même et d'autres pour ne pas le mettre. Chacun a ses arguments et c'est une "querelle" sans grand intérêt.

    Par contre, il serait obligatoire en C++ (je soupçonne le posteur original d'avoir compilé en C++, puisque ses messages d'erreurs mentionnaient des constructeurs/destructeurs)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Par défaut
    Super!
    merci DieuGlenn! Plus facile de comprendre quand le message est "ça ne sert à rien"

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/01/2015, 16h05
  2. Initialiser une structure contenant un tableau
    Par Muetdhiver dans le forum C
    Réponses: 4
    Dernier message: 13/10/2010, 18h46
  3. probleme avec une structure contenant un tableau
    Par bringer dans le forum Débuter
    Réponses: 8
    Dernier message: 31/05/2010, 16h18
  4. Comment créer une structure de donnée dynamiquement ?
    Par Beaunico dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 09h34
  5. Réponses: 8
    Dernier message: 20/12/2004, 15h14

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