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 :

probleme d'allocation dynamique


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut probleme d'allocation dynamique
    Bonjour a tout le monde!!

    J'ai un petit probleme....
    Voila un bout de code:

    mon_code.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    typedef struct toto *toto;
    ...
    mon_code.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    struct toto
    {
     int mon_champ;
    };
    ...
    void ma_fonction(void)
    {
    int i_alloc;
    toto = malloc(255 * sizeof (toto));
    for (i_alloc = 0; i_alloc < 255; i_alloc++)
       toto[i_alloc] = malloc(sizeof (toto));
    ....
    Et quand je veux acceder a un des champs de ma structure, je fais par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     fscanf(mon_fichier,"%d\n", &toto[i]->mon_champ);
    A la compilation, il me dit " incompatible types in assignment" a la ligne a l'interieur du for...

    Merci de votre aide...

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    je supose que ton .h est inclu avant la definition de ta structure, comment typer une variable avec un type non encore definie .
    ensuite tu veut allouer "mon_champ" alors qu'il est deja alloué (int mon_champ).
    si c'est un tableau de 255 entiers que tu a besoin un int mon_champ[255] suffit .....
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: probleme d'allocation dynamique
    Citation Envoyé par vince3320
    mon_code.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    typedef struct toto *toto;
    ...
    Si tu peux éviter les 'toto', ça a le don de m'énerver...
    D'autre part, c'est pas une bonne idée de mettre une '*' dans un typedef. On ne connait plus la nature du type des objets de ce type. Il n'y a aucune honte à manipuler des pointeurs. Il ne faut pas les cacher. Je recommande que les types structures soient suffixés par 's', et que les objets pointeurs soient préfixés par 'p_'.
    mon_code.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    struct toto
    {
     int mon_champ;
    };
    ...
    void ma_fonction(void)
    {
    int i_alloc;
    toto = malloc(255 * sizeof (toto));
    for (i_alloc = 0; i_alloc < 255; i_alloc++)
       toto[i_alloc] = malloc(sizeof (toto));
    ....
    'toto' n'est pas un objet, c'est un type.

    Et quand je veux acceder a un des champs de ma structure, je fais par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     fscanf(mon_fichier,"%d\n", &toto[i]->mon_champ);
    A la compilation, il me dit " incompatible types in assignment" a la ligne a l'interieur du for...
    Normal, vu de l'extérieur, la structure est opaque. On ne peut pas accéder à ses champs. Il faut une fonction 'accesseur'.
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut Re: probleme d'allocation dynamique
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par vince3320
    mon_code.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    typedef struct toto *toto;
    ...
    Si tu peux éviter les 'toto', ça a le don de m'énerver...
    D'autre part, c'est pas une bonne idée de mettre une '*' dans un typedef. On ne connait plus la nature du type des objets de ce type. Il n'y a aucune honte à manipuler des pointeurs. Il ne faut pas les cacher. Je recommande que les types structures soient suffixés par 's', et que les objets pointeurs soient préfixés par 'p_'.
    plus que le nom toto, ou le fait qu'il y ait une étoile dans un typedef, cette ligne presente une ambiguité terrible :
    toto designe un pointeur sur struct toto

    du coup la ligne

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toto* titi = malloc(255 * sizeof (toto)
    puis ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     toto[i_alloc] = malloc(sizeof (toto));
    deviens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    titi[i_alloc] = malloc(sizeof (struct toto));
    en enfin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    &toto[i]->mon_champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    &(titi[i]->mon_champ)
    mais evidement le mieux serait de donner des noms differents à la structure et au pointeur sur la structure...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    merci
    effectivement j'avais ecrit
    au lieu de
    Les autres erreur etaient des oublies pour cause de simplification
    Merci pour votre aide
    PS j'arrete les toto sur le forum!

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par vince3320
    ....
    PS j'arrete les toto sur le forum!
    arrete plutot les :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct toto * toto;
    Personnelement, je ne serais pas contre le retablissement du bucher pour les heretiques osant ecrire ce genre de choses

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    ben en fait c'est ce que l'on nous apprends a l'ecole!!
    lol
    cela permet de masquer l'implementation et de separer l'implementation de l'interface...
    Avec mes maigres connaissances, je trouve ca pas trop mal...

    Pourquoi tu trouve cela horrible?

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par vince3320
    ben en fait c'est ce que l'on nous apprends a l'ecole!!
    lol
    cela permet de masquer l'implementation et de separer l'implementation de l'interface...
    Avec mes maigres connaissances, je trouve ca pas trop mal...

    Pourquoi tu trouve cela horrible?
    suit la convention proposée plus haut eventuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct toto *p_toto;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct s_toto *toto;
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct s_toto *p_toto;
    mais que l'identifiant "toto" (ou un autre) ne designe pas deux choses differentes !

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par vince3320
    ben en fait c'est ce que l'on nous apprends a l'ecole!!
    lol
    cela permet de masquer l'implementation et de separer l'implementation de l'interface...
    Avec mes maigres connaissances, je trouve ca pas trop mal...

    Pourquoi tu trouve cela horrible?
    Je suis d'accord pour l'opacité (séparation interface/implémentation), mais pas pour cacher l'*'. Ca provoque des erreurs de codage terribles.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Points : 83
    Points
    83
    Par défaut
    daccord, tu as raison
    c'est vrai que c'est maladroit et desagreable pour celui qui lit le code!!
    Je le ferai a l'avenir
    Merci pour vos conseils a tous!!

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je suis d'accord pour l'opacité (séparation interface/implémentation), mais pas pour cacher l'*'. Ca provoque des erreurs de codage terribles.
    l'opacité viens du fait que tu ne publies pas la definition de la structure, mais juste son nom dans le header. Elle ne viens pas du typedef.

    L'opacité est à la mode, car c'est l'encapsulation que permet de C, et cela permet d'obtenir en C une programmation objet. C'est une bonne chose.

    Le typedef en est une autre. Et personnellement, qu'il y ait une étoile dans le type def ou pas cela ne me gene pas plus que cela, en particulier pour un type opaque, savoir si on a un pointeur, ou un indice dans un tabeau ou quoi que ce soit d'autre ne me fait ni chaud ni froid.

    Ce qui par contre me choque c'est la double utilisation du nom de la structure. Bien sur s'il sagissait de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct toto toto;
    je ne dirait rien.

    De plus, je pense que cela empeche ton code de compiler en C++, ce qui toujours dommage pour un header...

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

Discussions similaires

  1. probleme allocation dynamique de mémoire
    Par totoscill dans le forum C
    Réponses: 18
    Dernier message: 28/02/2008, 16h44
  2. Probleme Re Allocation dynamique 2D
    Par zicos dans le forum C
    Réponses: 6
    Dernier message: 03/06/2007, 11h01
  3. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  4. Probleme d'allocation dynamique
    Par Xav987 dans le forum C++
    Réponses: 6
    Dernier message: 04/03/2007, 13h43
  5. probleme allocation dynamique
    Par ciberju dans le forum C
    Réponses: 2
    Dernier message: 28/08/2006, 09h40

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