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 :

variables generiques


Sujet :

C

Vue hybride

issou variables generiques 31/10/2005, 22h46
David.Schris Te renseigner sur quoi... 31/10/2005, 23h10
Emmanuel Delahaye Re: variables generiques 31/10/2005, 23h12
issou Pour savoir commment... 31/10/2005, 23h13
issou Merci . Oui je... 31/10/2005, 23h15
Emmanuel Delahaye Ben non, pas besoin de cast... 31/10/2005, 23h15
issou Ok merci 31/10/2005, 23h18
issou Voila le code qui bug . Il... 01/11/2005, 16h17
Emmanuel Delahaye Hum... Compiling:... 01/11/2005, 16h37
Médinoc inclut stdlib.h au lieu de... 01/11/2005, 16h41
David.Schris Un peu de réflexion ne fait... 01/11/2005, 16h44
issou Voila c'est fait . ( quel est... 01/11/2005, 16h48
Emmanuel Delahaye Non standard. (N'existe pas... 01/11/2005, 16h51
issou Autant pour moi, si c'est le... 01/11/2005, 16h54
Mike888 Salut ! Je ne sais pas si... 01/11/2005, 17h54
issou Je sens une certaine moquerie... 01/11/2005, 18h14
David.Schris C'est bien pour ça que nous... 01/11/2005, 18h17
Mike888 Je parlais des listes... 01/11/2005, 18h22
issou On a pas dit le contraire et... 01/11/2005, 18h26
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut variables generiques
    Bonsoir , je ne trouve pas de tutoriel sur l'emploi de variable generique (void*) dans les listes chainées .

    Quelq'un pourrait il me renseigner ?

    Merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Te renseigner sur quoi exactement ?
    Un exemple à donner ? Un problème à exposer ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: variables generiques
    Citation Envoyé par issou
    Bonsoir , je ne trouve pas de tutoriel sur l'emploi de variable generique (void*) dans les listes chainées .

    Quelq'un pourrait il me renseigner ?
    Pas besoin de tutoriel, juste un cerveau en état de marche...

    C'est simple. Toute variable a une adresse. Il suffit que celle-ci soit valide pendant le moment où on en a besoin pour enregistrer celle-ci dans un void *. Ensuite, on la récupère intacte et on initalise un pointeur du bon type avec cette valeur d'adresse (et on évite ainsi les cast gores, même un soir d'Halloween...) et le tour est joué. Aucune difficulté majeure.

    Voir qsort() et sa fonction de comparaison.

    Fait de ton mieux et poste ton code si tu es planté...

  4. #4
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    Pour savoir commment récuperer la valeur pointer par mon void * . Je sais que je dois faire un "cast" mais je voudrais avoir un exemple pour comprendre bien le principe .

    Merci

  5. #5
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    Merci .

    C'est simple. Toute variable a une adresse. Il suffit que celle-ci soit valide pendant le moment où on en a besoin pour enregistrer celle-ci dans un void *. Ensuite, on la récupère intacte et on initalise un pointeur du bon type avec cette valeur d'adresse (et on évite ainsi les cast gores, même un soir d'Halloween...) et le tour est joué. Aucune difficulté majeure.


    Pas besoin de tutoriel, juste un cerveau en état de marche...
    Oui je crois que je dois avoir ca ...lol

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par issou
    Pour savoir commment récuperer la valeur pointer par mon void * . Je sais que je dois faire un "cast" mais je voudrais avoir un exemple pour comprendre bien le principe .
    Ben non, pas besoin de cast si tu fais ce que je t'ai déjà expliqué. Essaye, ça mord pas.

    Trop facile un exemple. C'est à toi de découvrir le mécanisme et de secouer ton neurone...

  7. #7
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    Ok merci

  8. #8
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    Voila le code qui bug . Il m'affiche toujours le même nom .

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <stdio.h>
    #include <alloc.h>
     
    struct liste
    {
       void * data;
       struct liste * suivant;
       struct liste * precedent;
    } depart, * noeud;
     
    struct element
    {
       char *nom;
    } tab_el[10];
     
    main( void )
    {
       int i;
       char  *nom;
     
       depart.suivant = NULL; // liste vide
       depart.precedent = NULL;
       noeud = & depart;
     
       for ( i = 0; i < 10; i++ )
       {
          noeud->suivant = ( struct liste * ) malloc( sizeof( struct liste ) );
          noeud->suivant->precedent = noeud; // l'adresse du precedent du suivant est l'adresse du noeud courant
          noeud = noeud->suivant;
          printf(" entrez nom : \n");fgets(nom,sizeof(nom),stdin);
          noeud->data = nom;
          tab_el[i].nom =  (char*) noeud->data; // affecte directly la valeur pointé par noeud->data  dans le tableau de structure
          noeud->suivant = NULL;
       }
     
       noeud = depart.suivant; //adresse du début de liste
       i = 0;
     
       // calcul le nombre d'elements de la liste
       while ( noeud )
       {
          i++;
          noeud = noeud->suivant;
       }
     
       printf( " il y a %d elements dans la liste \n", i );
       getchar();
       noeud = depart.suivant;
     
       //***********************************
       i=0;
       while ( i<10)
       {
          printf( " %s\n", tab_el[i].nom );
          i++;
       }
       getchar();
       //************************************
       return 0;
    }
    Un petit peu d'indulgence ne serait pas de refus merci . Ce code est pour s'entrainer et n'a aucun rôle précis ,mis a part apprendre à manipuler des listes doubles génériques ...(à bon entendeur ...)

    Merci

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par issou
    Voila le code qui bug.
    Hum...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Compiling: main.c
    main.c:2:19: alloc.h: No such file or directory
    main.c:27: warning: return type defaults to `int'
    main.c: In function `main':
    main.c:43: warning: implicit declaration of function `malloc'
    main.c:46: warning: implicit declaration of function `sieof'
    main.c:92:3: warning: no newline at end of file
    main.c:29: warning: 'nom' might be used uninitialized in this function
    Quelques remarques.
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    //#line 1
    #include <stdio.h>
    /* -ed-
    #include <alloc.h>
     
    n'existe pas en C standard. 
    */
    #include <stdlib.h>
     
    struct liste
    {
        void * data;
        struct liste * suivant;
        struct liste * precedent;
    }
    depart, * noeud;
     
    struct element
    {
        char *nom;
    }
    tab_el[10];
     
    /* -ed-
    main( void )
     
    en C99, le type retourne' doit etre explicite. 
    */
    int main(void )
    {
        int i;
        char  *nom;
     
        depart.suivant = NULL; // liste vide
        depart.precedent = NULL;
     
        noeud = & depart;
     
        for ( i = 0; i < 10; i++ )
        {
            noeud->suivant = ( struct liste * ) malloc( sizeof( struct liste ) );
     
            /* -ed- 
            Ne pas mettre de commentaires longs en fin de ligne. 
            Ne pas depasser 76 colonnes. 
            */
            // l'adresse du precedent du suivant est l'adresse du noeud courant
            noeud->suivant->precedent = noeud; 
            noeud = noeud->suivant;
            printf(" entrez nom : \n");
    /* -ed-
            fgets(nom,sieof(nom),stdin);
            
       - faute de frappe. Ne pas retaper, mais copier/coller.
       - parentheses inutiles.
       - garder en tete que fgets() prend aussi le '\n' (quand il peut)...
       - 'nom' n'a jamais ete initialise. Le comportement est indefini.
       
       * Arret de l'analyse du code. *
       
    */        
            fgets(nom,sizeof nom,stdin);
    <...>

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    inclut stdlib.h au lieu de alloc.h
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par issou
    Voila le code qui bug . Il m'affiche toujours le même nom .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
    #include <alloc.h>
     
    [...blablabla...]
       char  *nom;
    [...blablabla...]
    fgets(nom,sieof(nom),stdin);
    [...blablabla...]
    Un petit peu d'indulgence ne serait pas de refus merci .
    Un peu de réflexion ne fait pas de mal non plus : je pense que ce qu'Emmanuel Delahaye a voulu dire est qu'il ne faut pas constamment se tourner vers les autres quand on est face à un problème car c'est un bon moyen de ne rien apprendre.
    Autrement dit, il y a deux approches : "C'est en forgeant qu'on devient forgeron" ou "RentACoder".
    Je ne pense pas que ni ses remarques (ni les miennes) soient faites pour être méchantes/te rabaisser/etc...c'est juste qu'un petit "coup de pied au c*l" aide parfois à avancer

    Bref...
    1) Pour malloc(), il me semle qu'on inclut plutôt "<stdlib.h>" et pas "<alloc.h>".
    2) j'utiliserai "sizeof" plutôt que "sieof"
    3) avant de stocker des données lues à un emplacement pointé par...un pointeur ("char *nom" en est un il me semble), je m'assurerai que la zone pointée a été allouée. Or, je ne vois pas de "nom=malloc(taille)".

    [Edit 1] : ajout du "a" avant "vant" pour obtenir "avant"

  12. #12
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    --------------------------------------------------------------------------------

    inclut stdlib.h au lieu de alloc.h
    Voila c'est fait . ( quel est le probleme avec alloc.h ? )

    j'ai éditer le code et corriger la faute de frappe . Donc vola je repose la question

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par issou
    inclut stdlib.h au lieu de alloc.h
    Voila c'est fait . ( quel est le probleme avec alloc.h ? )
    Non standard. (N'existe pas chez moi, comme déjà indiqué).
    j'ai éditer le code et corriger la faute de frappe . Donc vola je repose la question
    (Puisque tu as trouvé le bouton [editer], profites en pour te relire et corriger tes fautes. Ca permet d'être lisible à peu de frais...)
    - Tu as laissé le <alloc.h>
    - Tu as reçu des indications pour corriger ton code. Il en manque une. Pour que les données soient stockée en liste chainée, il faut instancier les données attachées aux élément de la liste chainée. Pour celà, tu dois créer une copie des données (par exemple dynamique avec un strdup() du nom, par exemple).

    Nota : strdup() n'est pas standard, mais POSIX, ce qui la rend très portable. strdup() faisant un malloc() interne, il faut ensuite faire un free() quand on libère ...

  14. #14
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    Un peu de réflexion ne fait pas de mal non plus : je pense que ce qu'Emmanuel Delahaye a voulu dire est qu'il ne faut pas constamment se tourner vers les autres quand on est face à un problème car c'est un bon moyen de ne rien apprendre.
    Autrement dit, il y a deux approches : "C'est en forgeant qu'on devient forgeron" ou "RentACoder".
    Je ne pense pas que ni ses remarques (ni les miennes) soient faites pour être méchantes/te rabaisser/etc...c'est juste qu'un petit "coup de pied au c*l" aide parfois à avancer
    Autant pour moi, si c'est le sentiment que tu as eu, cela m'ennuie de poster un message sur le forum car j'aime apprendre par moi meme sans rien demander , mais quand j'ai pas le choix ? j'ai tester 20 fois , visister une dizaine de site parlant de ce sujet, tester differemment, shématiser et malgré ca je ne trouve pas c'est là que je me tourne à vous . Alors si vous pensez que je ne "forge" pas assez, désolé ...

    Sinon merci pour les explications .

    P.s: heureusement que j'ai écrit ceci avant lol :

    Un petit peu d'indulgence ne serait pas de refus merci .
    amicalement

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut
    Salut !

    Je ne sais pas si Emmanuel va se souvenir de moi ...
    L'année dernière, je l'ai rendu un peu dingue avec toutes mes questions et je lui ai expliqué à maintes reprises que ça ne tenait absolument pas de la mauvaise volonté mais qu'avec les minables infos qu'on nous donnait aux cours, il était très difficile de progresser, meme si on a un cerveau un bon état...
    Et je vois qu'aujourd'hui, c'est Issou (issu de la meme école et des memes profs) qui répète la meme chose. A nouveau, il ne faut pas croire qu'il se repose sur vous... Il est légèrement perdu et le moindre petit indice le ferait bien avancer; c'est en ce sens qu'il demandait un exemple.

    Voilà, c'était ma petite contribution au topic

  16. #16
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    Puisque tu as trouvé le bouton [editer
    Je sens une certaine moquerie dans ta phrase , cela n'etait pas nécessaire je pense . Enfin soit, on peut pas tout apprendre dans les bouquins de C non plus !

  17. #17
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par Mike888
    Il est légèrement perdu et le moindre petit indice le ferait bien avancer
    C'est bien pour ça que nous (moi y compris) lui en avons donné. On est pas des sauvages tout de même...

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut
    Je parlais des listes doublement chainées et surtout du pointeur sur void.

  19. #19
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    C'est bien pour ça que nous (moi y compris) lui en avons donné
    On a pas dit le contraire et d'ailleurs je t'ai remercié pour cela .

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2002, 13h32
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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