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

  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
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 442
    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 801
    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 801
    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 801
    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 801
    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]

  7. #7
    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
    Ahah oui c'est sûr que depuis le temps où tu est sur le forum tu as dût en voir des rigolos, mais des gars qu'ils veulent se compliquer la tâche en revanche ...

    En tout cas merci, ça fait toujours du bien de voir comment un "confirmé" pourrait structuré ce que l'on tente de faire.
    Maitrisé la syntaxe pour utiliser un langage de programmation est nécessaire, cependant ce qui fait qu'on arrivera toujours à nos fins est justement notre logique, notre capacité à nous adapter à n'importe qu'elle situation.

    Je pense que c'est enrichissant de se poser des problèmes comme celui-la, et je ne pense pas que son sera mon dernier post de ce type.
    Envisager un scénario, proposer la manière dont on organiserait soi-même le code pour le résoudre, puis si plusieurs personnes exposent leurs visions des choses on voit plus facilement les meilleurs optimisations possible.

    Bref, merci à toi et à plus sur le forum.

  8. #8
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir
    Son idée est bonne cependant, la réalisation pas au points.
    Il faut faire simple et il est préférable de faire une structure de donner contenant les informations de l'élève et dans celle-ci une structure de type union pour l'ensemble des notes de l'élève ou autres informations et le tout en une simple liste chaîner dont la manipulation serais beaucoup plus souple
    mais libre à lui de faire autrement
    à bientôt

  9. #9
    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 Sambia39,
    Intéressant, à vrai dire même si j'ai plusieurs fois vu parler du type de structure "union", je ne m'en suis pas encore plus intéressé que ça (jusqu'ici).
    Quelque chose que je met tout de suite sur ma liste de chose à voir. Merci pour ta réponse

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    et le tout en une simple liste chaîner dont la manipulation serais beaucoup plus souple
    Je suis désolé mais je ne trouve pas qu'une liste chainée soit plus souple qu'un tableau. Les trois seuls avantages d'une liste chainée par rapport au tableau sont
    1. l'insertion à un endroit précis
    2. la suppression d'un élément particulier
    3. la possibilité d'avoir autant de chainages que de critères de tri

    Le point n° 1 sera effacé par le point n° 3. En effet, si je commence à trier les chainages, pas besoin de trier les éléments alors autant insérer à la fin, comme on le fera pour un tableau. Le point n° 2 sera contrebalancé, dans un tableau, par l'ajout d'un flag dans la structure. Le flag est à vrai et l'élément est présent, il est à faux et il n'est "pas présent" donc on ne l'affiche pas (c'est d'ailleurs comme ça que fonctionne thunderbird pour "effacer" les messages" ou une bdd de type postgres pour "effacer" un enregistrement). Donc en fait, le seul vrai avantage à se priver de la possibilité d'accéder directement à l'élément [n] d'un tableau est le besoin d'avoir un (ou plusieurs) critères de tri dans ses éléments. Cela vaut-il le coup si ce n'est pas le cas ?
    Parce que je ne trouve pas extrêment compliqué de faire du malloc/realloc dans un tableau alloué...
    Code c : 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
    tableau=NULL;
    taille_tableau=0;
    indice_elem=0;
    tant que element_a_insérer
    {
        if (indice_elem == taille_tableau)
        {
            taille_tableau+=bloc;
            new=realloc(tableau, taille_tableau * sizeof(taille_element));    // Si tableau est null, realloc se comporte comme malloc
            if (new == NULL)
            {
                 // Cas à gérer (mais ce sera le même pour le malloc dans la liste chainée)
            }
            tableau=new;
        }
        tableau[indice_elem]=element_a_insérer;
        indice_elem++;
    }

    En paramétrant la valeur de "bloc" on peut jouer sur le nombre d'allocations réelles par rapport au nombre d'éléments et au final, indice_elem correspond à ce nombre d'éléments réellement insérés. Et en plus, regrouper taille_tableau, indice_elem et tableau dans une structure facilitera en plus sa manipulation...

    Citation Envoyé par Ojiuiookojbezib Voir le message
    même si j'ai plusieurs fois vu parler du type de structure "union", je ne m'en suis pas encore plus intéressé que ça (jusqu'ici).
    Une "union" est comme une structure sauf que ses membres occupent le même emplacement mémoire. Donc dans cet exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    union {
        int x;
        short y;
        double z;
    } toto;
    Tu ne pourras remplir et utiliser à un instant précis que l'un des 3 éléments toto.x, toto.y ou toto.z. Je ne vois pas trop, dans ton exemple d'élèves et de notes à stocker, à quoi cela pourrait bien servir. Pour chaque élève choisir entre stocker son nom, ses prénoms ou ses notes ?????
    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]

  11. #11
    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
    Je ne suis pas sûr que vous ayez bien compris ce que je veux faire, c'est comme si je souhaitais faire une BDD.
    L'objectif serais tout simplement de : indiquer son prénom par exemple. Si celui-ci est bien dans la BDD, alors j'afficherai toutes les infos que j'ai sur lui comme son nom, son age ...etc.
    Ensuite de nouvelles fonctionnalités seront apportés. Mais une étape à la fois. Normalement, en suivant le "FAQ C" :
    http://c.developpez.com/faq/?page=Le...p-egal-Bonjour
    je crois avoir réussit les BDD correctement où se trouverai nom, prenom, age des membres d'une promo.

    Seulement quelque chose me chiffonne, il y aurait-il une mis-à-jour de la FAQ à faire dans le point concernant la création d'un tableau de chaine de caractère via strcpy. J'ai beau avoir suivis cet exemple à la lettre, le compilateur refuse et me dit : "expected declaration specifiers or '...' before" (mon premier paramètre puis deuxième paramètre de strcpy).

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    /*** BASE DE DONNEES DE PRENOM D'ELEVES ***/
    char bdd_pr [][20];
    strcpy(bdd_pr[0], "Guillaume");
    strcpy(bdd_pr[1], "Paul");
    strcpy(bdd_pr[2], "Kevin");
    strcpy(bdd_pr[3], "Corentin");
    strcpy(bdd_pr[4], "Florian");
    strcpy(bdd_pr[5], "David");
    strcpy(bdd_pr[6], "Gael");
    strcpy(bdd_pr[7], "Thomas");
    Voyez-vous l'erreur ?

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ojiuiookojbezib Voir le message
    Je ne suis pas sûr que vous ayez bien compris ce que je veux faire, c'est comme si je souhaitais faire une BDD.
    L'objectif serais tout simplement de : indiquer son prénom par exemple. Si celui-ci est bien dans la BDD, alors j'afficherai toutes les infos que j'ai sur lui comme son nom, son age ...etc.
    Sisi, on a bien compris mais en fait, cela n'a aucune importance. Parce qu'avant de faire une bdd, il faut d'abord résoudre la problématique du stockage. Vas-tu stocker dans un tableau qui s'agrandit au fur et à mesure du besoin (comme mon exemple précédent), ou bien dans une liste chainée (comme évoqué par sambia39) ce qui te privera des avantages du tableau ?
    Une fois cette problématique résolue, rajouter des outils de recherche deviendra trivial. Parce que si tu réfléchis bien, une bdd ce n'est que de la donnée stockée (sous forme de simple fichier séquentiel en plus) et des outils de recherche et de mise à jour accessibles par un langage normalisé (le SQL). Tu rajoutes à ça une possibilité d'indexation, des contraintes et c'est tout. Après-tout, PostgreSQL est écrit en C...

    Donc quel que soit ton but, il faut d'abord penser au stockage.

    Citation Envoyé par Ojiuiookojbezib Voir le message
    Seulement quelque chose me chiffonne, il y aurait-il une mis-à-jour de la FAQ à faire dans le point concernant la création d'un tableau de chaine de caractère via strcpy. J'ai beau avoir suivis cet exemple à la lettre, le compilateur refuse et me dit : "expected declaration specifiers or '...' before" (mon premier paramètre puis deuxième paramètre de strcpy).

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    /*** BASE DE DONNEES DE PRENOM D'ELEVES ***/
    char bdd_pr [][20];
    strcpy(bdd_pr[0], "Guillaume");
    strcpy(bdd_pr[1], "Paul");
    strcpy(bdd_pr[2], "Kevin");
    strcpy(bdd_pr[3], "Corentin");
    strcpy(bdd_pr[4], "Florian");
    strcpy(bdd_pr[5], "David");
    strcpy(bdd_pr[6], "Gael");
    strcpy(bdd_pr[7], "Thomas");
    Voyez-vous l'erreur ?
    T'as oublié de donner une taille à ton tableau...
    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]

  13. #13
    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
    Mon moyen de stockage serait justement le tableau.
    Et le fait de préciser la taille du tableau ne résout pas le problème, si je fais : char bdd_pr [15][20];
    Aucun changement.

    Et c'était bien volontaire de ne pas préciser cette taille afin de le laissé dynamique.

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ojiuiookojbezib Voir le message
    Mon moyen de stockage serait justement le tableau.
    Ce qui limitera ton programme à la taille mémoire de ton système. C'est faisable (la bdd sqlite possède un flag permettant si on veut de la stocker intégralement en mémoire vive) mais c'est à prendre en compte...

    Citation Envoyé par Ojiuiookojbezib Voir le message
    Et le fait de préciser la taille du tableau ne résout pas le problème, si je fais : char bdd_pr [15][20];
    Aucun changement.
    Euh au fait, faut aussi penser à intégrer ton code dans une fonction !!!

    Citation Envoyé par Ojiuiookojbezib Voir le message
    Et c'était bien volontaire de ne pas préciser cette taille afin de le laissé dynamique.
    Ben non, le dynamisme n'existe pas en C. C'est à toi de le créer (ce que fait mon exemple de malloc/realloc). Le C99 induit un "semi-dynamisme" dans la mesure où on peut écrire char tab[expression_calculée] qui donnera un tableau de la taille calculée à l'exécution mais une fois cette taille définie, elle devient figée pour tout le reste du programme (enfin il me semble car j'ai jamais utilisé cette façon de faire)
    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]

  15. #15
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Je suis désolé mais je ne trouve pas qu'une liste chainée soit plus souple qu'un tableau. Les trois seuls avantages d'une liste chainée par rapport au tableau sont
    1. l'insertion à un endroit précis
    2. la suppression d'un élément particulier
    3. la possibilité d'avoir autant de chainages que de critères de tri

    Le point n° 1 sera effacé par le point n° 3. En effet, si je commence à trier les chainages, pas besoin de trier les éléments alors autant insérer à la fin, comme on le fera pour un tableau. Le point n° 2 sera contrebalancé, dans un tableau, par l'ajout d'un flag dans la structure. Le flag est à vrai et l'élément est présent, il est à faux et il n'est "pas présent" donc on ne l'affiche pas (c'est d'ailleurs comme ça que fonctionne thunderbird pour "effacer" les messages" ou une bdd de type postgres pour "effacer" un enregistrement). Donc en fait, le seul vrai avantage à se priver de la possibilité d'accéder directement à l'élément [n] d'un tableau est le besoin d'avoir un (ou plusieurs) critères de tri dans ses éléments. Cela vaut-il le coup si ce n'est pas le cas ?
    Parce que je ne trouve pas extrêment compliqué de faire du malloc/realloc dans un tableau alloué...
    Bonjour
    Ta justification est certes correcte mais, l'argument dont j'ai avancé en disant qu'une liste chainée est plus souple, viens en réalité de la conception de l'architecture du programme.
    Avant de m'expliquer sur mes arguments, il faut se poser la question qui suit & selon énoncés posté.
    Doit ton lui fournir la réponse à sa question ou la réponse dont il a besoin pour son programme ?
    Et pourquoi diable "je vais une de ces caractéristiques (comme le prenom) peut avoir plusieurs valeurs, ainsi je regroupe toute ces valeurs dans un typedef char [][]."
    regrouper toutes ces valeurs dans un type définis si je peux chainer chaque information ? ( sachant que j'ai une seule structure définie et qui peut contenir les informations comme non et prénom )

    Et comme tu la mentionné, la liste chainée à ces avantages et à ceci j'ajoute que la liste chaînée peut contenir autant de valeur que la mémoire peut contenir, et de ce fait la taille n’est plus fixe car chaque valeur de la liste est positionnée à des endroits différents dans la mémoire.
    Attention, je ne dis pas que l'utilisation d'un tableau comme tu la mentionné n'est un pas judicieux mais, il est techniquement plus lassant de faire des manipulations avec un tableau, alloué / réallouer de la mémoire mettre dans le new tableau les nouvelles valeurs ou pas et supprimer l’ancien tableau etc. contrairement à une liste chainée en plus des avantages que chacun a énoncé plus haut.
    Bref, chainé l'ensemble des informations et les manipuler par le biais des fonctions comme ajouter supprimer, lister, rechercher etc. rend plus souple la manipulation des donnée.
    Voilà pourquoi j'ai opté pour le choix d'une liste chainée mais, libre à lui de faire autrement.
    Pour ma part, j'ai juste fourni une réponse dont il a peut-être besoin pour son application
    à bientôt

+ 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