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 :

Tableau dans une structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Tableau dans une structure
    Bonsoir,

    J'ai une structure définie ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
      int nbcoups;
      coup coups[];
    }partie;
    Mais quand je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    partie part;
    part.coups=calloc(sizeof(coup), 3);
    Il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    invalid use of flexible array member.
    Je fais comment pour réserver la place en mémoire qu'il faut pour mon tableau?

    Merci d'avance !

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    tu demandes à ton ami (?) Raikyn, ou tu fais une recherche sur le forum http://www.developpez.net/forums/d12...f/#post6633092

    EDIT:
    Par curiosité, la structure a été définie par un prof dans un sujet, ou vous faites tous parti d'une même équipe et quelqu'un de cette équipe a choisi cette structure ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Oh tiens, je vais penser à le contacter !

    Ça a été défini par le prof.

    Et merci au fait

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Finalement, j'ai quand même un problème qui me rend dingue :

    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
     
    partie coups_possible(othellier p, joueur j) {
        partie *part;
        partie res;
        // Allocation de l'espace mémoire nécessaire :
        part = malloc(sizeof(partie)+3*sizeof(coup));
        // Exemple de modification de mon tableau de tableau dans la structure part :
        part-> coups[0][0]='a';
        part-> coups[0][1]='a';
        part-> coups[2][0]='a';
     
        res=*part;
        free(part);
        return res;
    }
    Lorsque j'affiche res.coups[0][0] ça m'affiche bien 'a' mais lorsque j'essaie d'afficher (le résultat de la fonction).coups[0][0], ça m'affiche des caractères bizarres.
    Quelqu'un sait pourquoi?

  5. #5
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Tu libères la mémoire que tu vas utiliser ensuite.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    J'ai fais exprès de copier la structure dans une autre variable (res) pour pouvoir libérer la mémoire. C'est bon normalement non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    res=*part;
    free(part);
    return res;
    Quand j'ai mis ça à la place, ça ne fonctionne pas non plus...

    Finalement, j'ai fais d'autre tests et ce qu'il m'affiche avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("  %c  ", (*part).coups[0][0]);
    n'est pas la même chose qu'avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("  %c  ", res.coups[0][0]);
    dans la fonction.

    Alors que j'ai bien fait avant :
    Je me suis trompée tout à l'heure.


    C'est très bizarre...

  7. #7
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 116
    Points : 32 969
    Points
    32 969
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Chamimi Voir le message
    J'ai fais exprès de copier la structure dans une autre variable (res) pour pouvoir libérer la mémoire. C'est bon normalement non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    res=*part;
    free(part);
    return res;
    Quand j'ai mis ça à la place, ça ne fonctionne pas non plus...

    Finalement, j'ai fais d'autre tests et ce qu'il m'affiche avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("  %c  ", (*part).coups[0][0]);
    n'est pas la même chose qu'avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("  %c  ", res.coups[0][0]);
    dans la fonction.

    Alors que j'ai bien fait avant :
    Je me suis trompée tout à l'heure.


    C'est très bizarre...
    Je suis sceptique quant au fait que cette ligne fasse une copie de l'objet initial.
    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.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Tu n'as pas attentivement lu l'utilisation des flexible array members. Tu ne dois pas créer de variable de ce type directement, uniquement des pointeurs, comme expliqué dans ce lien :

    When using structures with a flexible array member you should never directly declare an instance of the structure.

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    J'ai fais exprès de copier la structure dans une autre variable (res) pour pouvoir libérer la mémoire. C'est bon normalement non?
    Non ici, ça ne marche pas parce que la structure a un tableau "flexible" et donc que sa taille réelle est inconnue du compilateur.
    Tu ne peux pas construire une partie correcte avec la simple déclaration partie res; . C'est bien évident puisque tu as pris le soin d'en construire une par le malloc(). Si on pouvait le faire, on ne se serait pas cassé le chou à la créer par allocation dynamique .

    Le res=*part; ne fera que copier le début des structures, mais pas le contenu du tableau flexible.

    On doit avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    partie * coups_possible(othellier p, joueur j) {
        partie *part = malloc(sizeof(partie)+3*sizeof(coup));
        // Il faudrait tester ici la réussite de l'allocation
        part-> coups[0][0]='a';
        part-> coups[0][1]='a';
        part-> coups[2][0]='a';
        // free(part);  il faudra penser à le faire ailleurs
        return part;
    }
    .... 
    partie *part = coups_possible(....,....);
    if(part != NULL) printf("  %c  ", part->coups[0][0]);
    free(part);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Merci pour vos réponses !
    Il est donc bien impossible de renvoyer le structure même.

    En fait, la structure et la prototype de la fonction nous ont été imposés dans ce projet, d'où mon entêtement. Bon, ça veut dire qu'ils se sont trompés (génial !).

    Encore une fois merci

  11. #11
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Salut,

    je pense que pour la santé mentale de tout le monde, une âme charitable pourrait poster le sujet, non ?

    Car entre une mauvaise lecture du sujet, une mauvaise interprétation, des erreurs éventuelles, la fin du monde en décembre il y a beaucoup d'alternatives.

    Enfin, si vous voulez une aide utile ...

    EDIT: à essayer avec gcc :
    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
    23
    24
    /* test.c */
    #include <stdio.h>
     
    typedef struct {
      int a;
    } ma_struct;
     
    ma_struct f(ma_struct m)
    {
      m.a=2;
      return m;
    }
     
    int main()
    {
      ma_struct m;
      ma_struct n;
     
      m.a=1;
      n=f(m);
     
      printf("m.a=%d\n", m.a);
      printf("n.a=%d\n", n.a);
    }
    compilation :
    À votre avis ? ça compile ? ça donne un résultat ? lequel ? Est-ce propre ?

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Héhé, kwariz, pour votre santé mentale, j'ai fait l'effort de poster le sujet

    http://www.pps.jussieu.fr/~rifflet/e...projet-lc4.pdf

    Voilà. Mais quelqu'un a posé la question à notre chargé de TD et effectivement, il y avait une erreur dans le sujet. Ils vont (j'espère avant la date limite ) corriger le sujet et nous le faire savoir.

    à essayer avec gcc :
    À votre avis ? ça compile ? ça donne un résultat ? lequel ? Est-ce propre ?
    C'est un avis ou un test que vous demandez?
    Si c'est un avis, je pense que ça compile, que ça fonctionne mais que c'est moche.
    Mais mon problème était plus une question de modifs de tableaux flexibles dans une structure que de modifs de types simples dans une structure.

    Si c'est un test :
    Ca compile et ça donne bien :

  13. #13
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Merci Chamimi
    Tu as sauvé ma santé mentale, et non ... "ils" ne se sont pas trompés.
    La conception "imposée" n'est certainement pas celle que j'aurais choisie, mais elle est imposée donc vous devez faire avec ...

    EDIT: peut être pourriez-vous "négocier" un changement d'API ?

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    "ils" ne se sont pas trompés
    mais elle est imposée donc vous devez faire avec ...
    Dans la mesure où l'on ne peut pas faire fonctionner cette fonction (partie coups_possible(othellier p, joueur j)) avec la structure partie donnée, je pense qu'ils se sont bien plantés oui

    Oui, j'ai demandé au prof si on ne pouvait pas modifier les prototypes des fonctions. J'attends sa réponse...

  15. #15
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bien sûr on peut, mais cela va impliquer des fuites mémoires inévitables, car tu vas allouer dynamiquement une structure dont tu ne renverras pas l'adresse et dont le contenu se fera copié en perdant tout espoir de récupérer l'adresse du bloc alloué.
    C'est donc faisable, mais absolument pas propre ...

    Maintenant, je pense effectivement que personne ne donne ce genre de contraintes volontairement.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    C'est possible? Tu pourrais me dire comment parce que j'ai tout essayé, le tableau n'est jamais copié correctement...

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

Discussions similaires

  1. Utilisation d'un tableau dans une structure
    Par Angelique64 dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/06/2009, 11h05
  2. allocation d'un tableau dans une structure
    Par Klaine dans le forum Débuter
    Réponses: 3
    Dernier message: 02/04/2008, 23h51
  3. Problème de tableau dans une structure
    Par zarbiman dans le forum Réseau
    Réponses: 5
    Dernier message: 15/12/2007, 18h21
  4. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  5. Tableau dans une structure
    Par Elstak dans le forum C
    Réponses: 3
    Dernier message: 25/04/2007, 11h45

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