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 d'une structure avec tableau


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut Allocation d'une structure avec tableau
    Bonsoir a vous tous,
    voila j'aimerais savoir si ce code est bon...il est bien passé au compilateur...
    Mais voila je voulais savoir si mes allocations etaient necessaires...

    Est-il necessaire de déclarer les tableaux compris dans une structure?

    Merci d'avance
    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
    25
    26
    27
    28
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
     char *mot;
     int nombre;
    }Mot;
     
    void Init (Mot T[])
    {
     char *tmp=(char*)malloc(sizeof(char));
     if (!tmp) 
       {
        fprintf(stderr,"Erreur alloc memoire\n");
        exit (EXIT_FAILURE);
       }
     tmp="\0";
     T = (Mot *) malloc (sizeof(Mot));
      if (!T) 
       {
        fprintf(stderr,"Erreur alloc memoire\n");
        exit (EXIT_FAILURE);
       }
     T->nombre=0;
     T->mot=tmp;
    }

  2. #2
    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 : 47
    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
    Surement pas ! Le mieux est de faire retourner un tableau de structure (si c'est bien ce que tu veux créer) par la fonction donc un pointeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mot * Init (size_t size)
    Là c'est déjà plus cohérent !

    Je ne vois pas l'intérêt d'allouer mot à un seul caractère, le mieux c'est de le mettre directement à la bonne taille ou bien d'attendre de posséder la taille qui conviens puis d'allouer l'espace en conséquence !

    Ceci est n'est pas tout à fait correct:
    Etant donné que tu as alloué 1 char à temp donc si tu veux mettre un caractère null fait plutôt comme ca:
    Mais là encore je ne vois pas l'intérêt d'une telle chaîne/allocation, autant la faire au moment où tu copies vraiment une chaîne dans cet espace car là ca te fait une allocation pour rien et plus on peut économiser des allocations mieux c'est et donc en fait pour si peu c'est du temps de gâché

    Au passage, les casts sur les malloc ne sont pas une bonne idée, cela peut cacher d'éventuels problèmes donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T = malloc (sizeof(Mot));
    Sauf si tu veux que le code soit également compilable pas un compilateur C++ auquel cas il sera obligatoire !

    Une version modifiée de ta fonction serait:
    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
    Mot * Init (size_t size, const char * mot)
    {
       Mot * T = NULL;
     
       if (size > 0 && mot != NULL)
       {
          T = malloc (size * sizeof (* T));
     
          if (T != NULL)
          {
             T->nombre = strlen (mot);
             T->mot = malloc (T->nombre + 1);
     
             if (T->mot != NULL)
             {
                strcpy (T->mot, mot);
             }
          }
       }
     
       return T;
    }
    Enfin si j'ai bien compris ce que tu cherches à faire mais on peut l'améliorer un peu !

  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
    Citation Envoyé par line86 Voir le message
    Bonsoir a vous tous,
    voila j'aimerais savoir si ce code est bon...il est bien passé au compilateur...
    Mais voila je voulais savoir si mes allocations etaient necessaires...
    <...>
    Horrible !

    Tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       char *tmp = malloc (sizeof (char));
    <...>
       tmp = "\0";
    Ca signifie que tu remplaces l'adresse du bloc alloué par l'adresse d'une chaine... Tu as donc perdu l'adresse du bloc. De plus, la chaine n'est pas modifiable... Tu veux dans doute
    ou
    ou encore
    Ensuite, ceci n'a aucun sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Init (Mot T[])
    {
     
     T = malloc (sizeof(Mot));
    Tu modifies la valeur d'un paramètre, ça ne va pas modifier l'original...

    http://emmanuel-delahaye.developpez....difie_variable

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Avril 2007
    Messages : 143
    Points : 57
    Points
    57
    Par défaut
    Bonsoir a vous,
    merci pour vos réponses !
    Mais juste pour précisions

    1- Le cast c'est par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Liste p = (cellule *) malloc (sizeof (cellule));
    c'est qu'on a toujours appris a faire ainsi lol... Je viens effectivement de regarder dans les tuto de c et il n'y a jamais de cast... Je vous remercie de m'avoir éclairer sur ce point !!!!

    2- Le prototype de la fonction était ainsi déclaré dans mon partiel... lol c'est pour ca que je me suis trompé dans ma fonction je ne voyais pas comment faire

    Je vous remercie je vais essayer de reprendre tout ca

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 68
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Citation Envoyé par line86 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Liste p = (cellule *) malloc (sizeof (cellule));
    Juste une question : quel est le compilateur utilisé ?
    Il me semble que cette syntaxe n'est pas autorisée en C "classique" (en C++ oui).

  6. #6
    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 xavi Voir le message
    Juste une question : quel est le compilateur utilisé ?
    Il me semble que cette syntaxe n'est pas autorisée en C "classique" (en C++ oui).
    Non. Elle est autorisée mais déconseillée en C et elle est obligatoire en C++ (mais il y a new/delete, alors pourquoi faire...)

Discussions similaires

  1. Comparaison de structures avec tableau ?
    Par Nikolas dans le forum C++
    Réponses: 26
    Dernier message: 01/11/2010, 17h06
  2. Tri d'une structure avec ptr sur void
    Par badack dans le forum C
    Réponses: 6
    Dernier message: 12/04/2007, 11h17
  3. Mapper une structure en tableau de byte
    Par zarathoustroy dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 16/12/2006, 15h47
  4. Drag and drop d'une structure avec virtualtreeview
    Par laudur dans le forum Composants VCL
    Réponses: 1
    Dernier message: 03/05/2006, 16h14
  5. [XSL-FO] Modifer une structure de tableau dans for-each
    Par serwol dans le forum XSL/XSLT/XPATH
    Réponses: 24
    Dernier message: 17/06/2005, 17h38

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