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 :

Typedef char** ? dans struct


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Par défaut Typedef char** ? dans struct
    Bonjour .
    Je bug sur un petit truc dans un petit programme.
    Avant de montrer les codes je vais expliquer ce que je cherche à faire tout bêtement : Faire un tableau de char avec différentes valeurs, ce tableau sera un type (typedef), et je l'utiliserai dans une autre struct (elle aussi typedef).

    Pour visualer encore plus simplement : 1 classe d'élève; chaque élève à plusieurs caractéristiques (typedef struc); une de ces caractéristiques (comme le prenom) peut avoir plusieurs valeurs, ainsi je regroupe toute ces valeurs dans un typedef char [][].

    Code :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <string.h>
    /* Les différentes valeurs des prenom des etudiants */
    typedef char pre_ini[][15] =
        {
            "Guillaume",
            "Paul",
            "Kevin",
            "Corentin",
            "Florian",
            "David",
            "Gael",
            "Thomas"
        };
     
    /* Structure étudiant */
    typedef struct
    {
        char nom[20];
        pre_ini prenom;
        int age;
        short race;
        short spe;
    } etudiant;
    Fonction main :
    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
    int main(int argc,  char *argv[])
    {
     
    /** DATE ET HEURE LOCALE -- WINDOWS **/
        SYSTEMTIME Time;
     
        GetLocalTime(&Time);
     
        printf("\n\n Bien le bonjour utilisateur !! \1");
     
        printf("\n\t\4 Nous sommes le : %02d/%02d/%04d ", Time.wDay, Time.wMonth, Time.wYear);
     
        printf("\n\t\4 Et il est : %02dh %02dmn\n", Time.wHour, Time.wMinute);
    /** Fin des instructions de date - WINDOWS **/
     
        /******************/
     
        etudiant *ptr_etu = NULL;
        ptr_etu = malloc (sizeof(etudiant)*9);
     
     
        printf("Le nom du gagnant du jour est : %s !!", ptr_etu->prenom);
     
     
        /******************/
     
     
        return 0;
    }
    Ne vous souciez pas des fonctions du time windows. Mon compilateur me renvoie comme erreur : "Array size missing in 'prenom' ".

    Cela ma semblé claire au début, j'ai donc essayer de corriger en faisant un : Mais finalement je ne suis qu'à moitié surpris du résultat, le compilateur me renvoyant :
    " Array type has incomplet element type " seulement je bute sur la manière de résoudre ce problème.

    Merci d'avance pour votre aide .

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Bonsoir,

    « typedef » n'est pas du tout un type de donnée en soi. C'est un mot-clé qui signifie « Type Definition » (« définition de type ») et qui sert à indiquer au compilateur que tu vas définir un nouveau type. En réalité, tu ne vas pas réellement définir un nouveau type mais plutôt créer un alias sur une définition de type existante. Cette définition se fait exactement de la même façon que l'on déclare une variable ou une instance d'une structure, à ceci près que l'identifiant ne sera pas celui de la variable en question mais celui de l'alias. Si, par exemple, tu écris :

    Tu pourras alors invariablement déclarer tes variables entières avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        int     x,y,z;
        entier  i,j,k;
    En principe, le C propose déjà un mécanisme pour faire cela avec les structures, afin d'éviter d'avoir à re-spécifier la définition complète de la structure à chaque fois qu'on veut l'instancier. Il suffit de la nommer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct fiche_personne { int age; char prenom[20]; char nom[20] };
    … pour pouvoir instancier facilement des variables avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct fiche_personne a,b,c;
    Malgré cela, une habitude s'est développée assez vite avec le C, consistant à utiliser typedef pour donner directement un nom de type aux structures et avoir à se passer du mot-clé « struct ». Non seulement ça éclaircit le code et permet de présenter des types composés comme des types natifs, mais cela permet également de les redéfinir en utilisant d'autres choses (y compris des types natifs si besoin), tout en préservant la compatibilité du code.

    Cette manière de faire a été reprise, étendue et standardisée par le C++, où la déclaration d'une classe vaut automatiquement définition de type.

  3. #3
    Membre confirmé
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Par défaut
    Merci, mais néanmoins je réussirai à faire ceci si je codais "normalement". Je m'explique je ne fait ce programme non pas pour m'entrainer à une utiliser une structure mais plutôt pour chercher à me compliquer la tâche. Dans le but de voir si je pouvais réussir à faire ceci de toute les manières possibles.
    Ce n'est clairement pas optimal, mais ça doit être faisable, alors j'essaye ...
    Ton message ne m'a pas vraiment aidé
    Je pense que ma manière d'utiliser le typedef char est mauvaise, je finis peut être par m’emmêler les pinceaux ...

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    En dehors de la faisabilité que je ne connais pas, le C est trop bas niveau pour que tu t'amuses à cacher un tableau derrière un type. Parce qu'on ne peut pas manipuler un tableau comme un truc individuel. Par exemple écrire if (tableau1 == tableau2), chose qui fonctionnera dans tout langage de plus haut niveau, ne fonctionnera pas en C.
    Donc le programmeur a "besoin" de connaitre ce qu'il manipule et si tu obfusques l'info, tu vas ensuite gêner le développement et surtout toute évolutivité.
    Le raisonnement vaut aussi pour ceux qui tentent de cacher leurs pointeurs.

    Et franchement écrire un code C est déjà pas facile (il faut sans cesse réinventer la roue) et tu veux en plus "te compliquer la tâche" ??? Essaye déjà de la produire correctement cette tâche ce sera déjà pas mal compliqué en soi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Par défaut
    Oui merci bien. Quand je disais me compliquer la tâche, je voulais simplement tester différente manières d'arriver à un résultat. Bien entendu pendant que je programmait, j'imaginais bien qu'il y aurait des problèmes à la c**.
    Cependant ne serait-il pas possible d'utiliser une enumeration à la place du char ? Afin d'arriver au même résultat.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Une énumération consiste à remplacer des chiffres par des mots clefs plus représentatifs de la donnée manipulée. Par exemple remplacer "0" par "lundi" te permet ensuite de tester if (jour == lundi) ce qui est plus parlant que if (jour == 0).
    Je ne vois pas trop comment utiliser cet outil dans ton problème initial (à savoir stocker tous les prénoms d'un élève).

    Si je devais faire ce truc, je partirais ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define SIZE_MAX      (20)
    #define NB_MAX    (5)
    typedef struct {
        char nom[SIZE_MAX + 1];
        char prenom[NB_MAX][SIZE_MAX + 1];
    } t_eleve;

    Ensuite, soit un tableau d'élèves ce qui impose d'avoir une idée du volume d'élèves t_eleve tab_eleve[100], soit, si le nombre d'élèves n'est pas connu, un tableau alloué dynamiquement t_eleve *tab_eleve; tab_eleve=malloc(nb_calculé * sizeof(t_eleve)) (avec du realloc si besoin).
    Mais cela dépend aussi du besoin. Si par exemple tu veux pouvoir trier tes élèves par nom ou par classement, alors une liste chainée sera peut-être plus envisageable car tu pourras lui mettre autant de chainages que de critères de tri.

    Certains pourraient se sentir gênés d'allouer 5 prénoms par élève alors que certains n'en ont peut-être que 2 ou, pire, certains en ont 6. Dans ce cas, une allocation dynamique du nombre de prénoms pourra être envisagée ou même (pour "te compliquer la vie"), une liste chainée des prénoms pour chaque élève.

    Donc il y a vraiment déjà pas mal de cas à envisager rien qu'en C pur, si en plus tu veux chercher d'autres écritures possibles...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Initialiser char dynamique dans struct
    Par amyb68 dans le forum C
    Réponses: 6
    Dernier message: 28/12/2010, 11h16
  2. un char dans un float
    Par speedcore dans le forum C
    Réponses: 7
    Dernier message: 10/05/2006, 16h54
  3. Insertion d'un char dans un char *
    Par bugmenot dans le forum C
    Réponses: 2
    Dernier message: 22/10/2005, 15h17
  4. Changer un char dans une chaine
    Par Calaz dans le forum C
    Réponses: 10
    Dernier message: 07/10/2005, 13h32
  5. [SQL] Convertir un champ INT en CHAR dans un SELECT ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/03/2005, 14h45

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