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 :

Déclarer un tableau de structures litéral


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 130
    Par défaut Déclarer un tableau de structures litéral
    Bonjour,

    Je pensais pouvoir déclarer un tableau de littéraux de structure comme ci-dessous.
    Mais je ne trouve pas la bonne syntaxe. Je ne comprends pas où est mon erreur
    Si quelqu'un sait
    Cordialement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct spectacle {*
    char intitule[50];*
    int nbPlace;*
    };*
    //struct spectacle tabSpectacles[10];*
     
    //void init() {*
    struct spectacle tabSpectacles = *{*
    {spectacle {"En attendant goto", 10}},*
    {spectacle {"Tant qu'il y aura des pommes", 4}},*
    {spectacle {"}Notre pam de paris", 6}}*
    * * };*
    Répondre
    Voir ce message dans son contexte

    Se désabonner du forum* Se désabonner de cette discussion* Modifier vos préférences pour les récapitulatifs de messages de forum
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 320
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Hormis les dépassements de tampon non gérés voici un petit exemple de déclaration fonctionnel :

    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
    #include <stdio.h>
     
    typedef struct spectacle {
      char intitule[50];
      int nbPlace;
    }t_spectacle;
     
    int main (int argc, char **argv) {
     
      t_spectacle tabSpectacles [3] = {{"En attendant goto", 10},
    				 {"Tant qu'il y aura des pommes", 4},
    				 {"Notre pam de paris", 6}};
     
      for (int i=0; i < 3; i++)
        printf ("%s : %d\n", tabSpectacles[i].intitule, tabSpectacles[i].nbPlace);
     
      return 0;
    }
    Le résultat en console :
    En attendant goto : 10
    Tant qu'il y aura des pommes : 4
    Notre pam de paris : 6

  3. #3
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2013
    Messages
    1 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 130
    Par défaut
    Merci

    Ca fait tellement longtemps que je n'ai pas fait de C, et je suis pollué par mon Java.

    Je veux sortir la déclaration du tableau en global .
    Je déclare en dehors des fonctions au début.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    * t_spectacle tabSpectacles [];
    Mais dans la fonction quand je veut le remplir avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tabSpectacles = ....
    Il y a une erreur
    Consultez mes articles sur l'accessibilité numérique :

    Comment rendre son application SWING accessible aux non voyants
    Créer des applications web accessibles à tous

    YES WE CAN BLANCHE !!!

    Rappelez-vous que Google est le plus grand aveugle d'Internet...
    Plus c'est accessible pour nous, plus c'est accessible pour lui,
    et meilleur sera votre score de référencement !

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 320
    Billets dans le blog
    5
    Par défaut
    Écrire t_spectacle tabSpectacles []; revient à déclarer un tableau vide sans taille. Soit tu déclares tout en global soit tu devras passer par l'allocation dynamique (dans le tas).

    Un petit exemple d'allocation dynamique :

    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
    29
    30
    31
    32
    33
    34
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct spectacle {
      char intitule[50];
      int nbPlace;
    }t_spectacle;
     
    t_spectacle *tabSpectacles;
     
    void remplir_un_element (t_spectacle *tabSpectacles, int position, const char* intitule, int nbPlace) {
      memcpy (tabSpectacles[position].intitule, intitule, strlen (intitule));
      tabSpectacles[position].nbPlace = nbPlace;
    }
     
    int main (int argc, char **argv) {
     
      /* Allocation mémoire pour 3 éléments */
      tabSpectacles = malloc (3 * sizeof (t_spectacle));
     
      /* Remplissage des 3 éléments */
      remplir_un_element (tabSpectacles, 0, "En attendant goto", 10);
      remplir_un_element (tabSpectacles, 1, "Tant qu'il y aura des pommes", 4);
      remplir_un_element (tabSpectacles, 2, "Notre pam de paris", 6);
     
      for (int i=0; i < 3; i++)
        printf ("%s : %d\n", tabSpectacles[i].intitule, tabSpectacles[i].nbPlace);
     
      /* Libération mémoire */
      free (tabSpectacles);
     
      return 0;
    }
    Édit:
    Sinon tu déclares tout en global :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    t_spectacle tabSpectacles [3] = {{"En attendant goto", 10},
    				 {"Tant qu'il y aura des pommes", 4},
    				 {"Notre pam de paris", 6}};
     
    int main (int argc, char **argv) {
      for (int i=0; i < 3; i++)
        printf ("%s : %d\n", tabSpectacles[i].intitule, tabSpectacles[i].nbPlace);
     
      return 0;
    }

  5. #5
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 805
    Par défaut
    En gros (Édit: barbecued par @gerald3d )

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    typedef struct s_spectacle {
      char intitule[50];
      int nbPlace;
    } t_spectacle;
     
     
    int main()
    {
      t_spectacle* list_spectacles = NULL;
     
      list_spectacles = malloc(3 * sizeof(t_spectacle));
     
      if (list_spectacles != NULL) {
        unsigned char i;
     
        list_spectacles[0].nbPlace = 10;
        strcpy(list_spectacles[0].intitule, "En attendant goto");
     
        list_spectacles[1].nbPlace = 4;
        strcpy(list_spectacles[1].intitule, "Tant qu'il y aura des pommes");
     
        list_spectacles[2].nbPlace = 6;
        strcpy(list_spectacles[2].intitule, "Notre pam de paris");
     
        for(i=0; i < 3; ++i) {
           printf ("%s : %d\n", list_spectacles[i].intitule, list_spectacles[i].nbPlace);
        }
     
        free(list_spectacles); list_spectacles = NULL;
      } else {
        printf("main - error: malloc\n");
      }
     
     
      return 0;
    }
    Cela s'est le mode facile parce que les chaînes sont en dur
    Sinon pour chaque chaîne, compter le nombre de caractères (strlen), allouer la chaîne + 1, strcpy ou strncpy, finir la chaine avec le caractère final '\0' et à la toute fin libérer la chaine.

    Il faudrait dans ce cas faire des fonctions qui accompagnent ta structure, qui font le travail : s_spectacle_copy(char*, int), s_spectacle_init(), s_spectacle_free(), ...

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 320
    Billets dans le blog
    5
    Par défaut
    Tout à fait d'accord avec toi @foetus. Je n'ai pas voulu trop surcharger le code pour juste exposer un principe simple. De toute façon dés qu'on traite des chaînes de caractères avec des allocations mémoires la rigueur est de mise .

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/05/2006, 12h46
  2. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 16h00
  3. [VB6]Tri multi-colonnes sur tableau de structure
    Par ELGUEVEL dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 17/02/2006, 09h02
  4. Réponses: 9
    Dernier message: 13/02/2006, 09h39
  5. Trier un tableau de structures
    Par Yux dans le forum C
    Réponses: 7
    Dernier message: 05/11/2005, 18h28

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