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 :

boucle while simple


Sujet :

C

  1. #21
    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 xeron33 Voir le message
    j'ai laissé le fflush qui apparement pose pas de problème
    Si tu parles de fflush (stdin), c'est un tord. Cet appel de fonction n'est pas défini par le langage C et tout peut arriver. Il faut donc le retirer pour écrire un code conforme.

    En réalité, fflush (stdin) est défini sous DOS-Windows (vidage de stdin), mais sous unixoïde, dans le meilleur des cas, il de fait rien, et dans les pires, il provoque un crash. L'usage est donc non portable, voire dangereux
    par contre j'aimerais que tu m'expliques le but du code suivant dans ta fonction fclean mis en italique et en gras en fait si j'ai bien compris tu remplaces "\n" par" \O" dans quel but ?(Qu'elle est l'utilité de "\O" par apport à "\n"?
    C'est pas '\O' (qui n'existe pas), mais '\0' qui est équivalent à la valeur numérique 0 et qui est (ici), le marqueur de fin de chaine..

    D'ailleurs autre chose dans ton code tu avais : que j'ai remplaçé par
    tu as bien fait, car '0' est le caractère 0 (le chiffre) et non la valeur numérique 0.

  2. #22
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Si tu parles de fflush (stdin), c'est un tord. Cet appel de fonction n'est pas défini par le langage C et tout peut arriver. Il faut donc le retirer pour écrire un code conforme.

    En réalité, fflush (stdin) est défini sous DOS-Windows (vidage de stdin), mais sous unixoïde, dans le meilleur des cas, il de fait rien, et dans les pires, il provoque un crash. L'usage est donc non portable, voire dangereux

    C'est pas '\O' (qui n'existe pas), mais '\0' qui est équivallent à la valeur numérique 0.


    tu as bien fait, car '0' est le caractère 0 (le chiffre) et non la valeur numérique 0.
    Pour le fflush je travaille sous Windows dois l'enlever ?
    Merçi quel est le but de \0 ? Merçi
    A +

  3. #23
    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 xeron33 Voir le message
    Pour le fflush je travaille sous Windows dois l'enlever ?
    EDIT : Si c'est fflush (stdin), oui. Si c'est fflush (stdout), il est parfois utile, voire indispensable

    http://emmanuel-delahaye.developpez....#fflush_stdout
    quel est le but de \0 ?
    Je ne l'ai pas précisé ?
    Citation Envoyé par Emmanuel
    C'est pas '\O' (qui n'existe pas), mais '\0' qui est équivalent à la valeur numérique 0 et qui est (ici), le marqueur de fin de chaine..

  4. #24
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Si tu parles de fflush (stdin), c'est un tord. Cet appel de fonction n'est pas défini par le langage C et tout peut arriver. Il faut donc le retirer pour écrire un code conforme.
    Le fflush(stdin) qui s'est glissé dans le code original était une faute de frappe. Le code original a déjà été corrigé et stdin remplacé par stdout.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #25
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    D'ailleurs autre chose dans ton code tu avais : que j'ai remplaçé par et l'une ou l'autre solution marche.
    NON, dans mon code, j'avais:
    et c'est tout à fait équivalent à
    qui n'est autre que la représentation octale du caractère nul. Le code original était OK, à une faute de frappe prêt déjà mentionnée plus haut.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #26
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Pour le fflush je travaille sous Windows dois l'enlever ?
    Merçi quel est le but de \0 ? Merçi
    A +
    Tu dois garder l'appel à la fonction fflush(), mais c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("voulez-vous-continuer ?O/N ");
    fflush(stdout);
    que tu dois utiliser. Cela permet de vider purger le tampon du flux de sortie standard (stdout) et ainsi de forcer l'affichage de l'invite. On peut éviter d'avoir à utiliser cette fonction en terminant la chaine de format avec une caractère de fin de ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("voulez-vous-continuer ?O/N\n");
    /* Ici, l'appel a fflush(stdout) n'est plus necessaire */
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #27
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Tu dois garder l'appel à la fonction fflush(), mais c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("voulez-vous-continuer ?O/N ");
    fflush(stdout);
    que tu dois utiliser. Cela permet de vider purger le tampon du flux de sortie standard (stdout) et ainsi de forcer l'affichage de l'invite. On peut éviter d'avoir à utiliser cette fonction en terminant la chaine de format avec une caractère de fin de ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("voulez-vous-continuer ?O/N\n");
    /* Ici, l'appel a fflush(stdout) n'est plus necessaire */
    Thierry
    bonsoir Thierry je viens de tester ça change rien qu'il y soit ou pas par contre ok si j'ai "\n" oui j'ai retour chariot
    D'autre part ta fonction fclean :
    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
     
    void fclean(char *s_buffer, FILE *stream)
    	 {
    	     if (s_buffer != NULL)
    	     {
    	         /* On teste la présence du caractère de fin de ligne */
    	         char *pc = strchr(s_buffer, '\n');
     
    	         if (pc != NULL)
    	         {
    	             /* La saisie est complète: on remplace '\n' par '\0' */
    	             *pc = '\0';
     
    	         }
    	         else /* La saisie a été tronquée: on vide le tampon de stdin */
    	         {
    	             int c;
    	  /* fgetc lit le caractère courant du flux int fgetc(FILE * flux)   */      
    	             while ((c = fgetc(stream)) != '\n' && c != EOF)
    	             {
    	                 /* Cette boucle ne fait rien */
    	                  continue;
    	             }
    	         }
    	     }
    	 }
    Questions à propos de ta fonction :
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (pc != NULL)
    /* La saisie est complète: on remplace '\n' par '\0' */
    	             *pc = '\0';
    Si j'ai bien compris si *pc!=null tu vires le retour chariot par \0 (fin de chaine) pour netoyer le tampon
    2) pourquoi si *pc=Null ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    else /* La saisie a été tronquée: on vide le tampon de stdin */
    	         {
    	             int c;
    	  /* fgetc lit le caractère courant du flux int fgetc(FILE * flux)   */      
    	             while ((c = fgetc(stream)) != '\n' && c != EOF)
    	             {
    	                 /* Cette boucle ne fait rien */
    	                  continue;
    	             }
    	         }
    	     }
    	 }
    Et là je comprends pas; car si *pc = Null tu devrais rien trouver dans le tampon niveau" \n" puisque tu codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     /* On teste la présence du caractère de fin de ligne */
    	         char *pc = strchr(s_buffer, '\n');
    pour tester de la présence ou pas de "\n"
    Excuses moi pour toutes ces interrogations mais je débute en C et plein de questions me viennent à l'esprit et utiliser une fonction sans comprendre c'est pas génial... j'aurai d'autres questions mais + tard
    Merçi en tout cas a +

  8. #28
    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 xeron33 Voir le message
    Questions à propos de ta fonction :
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (pc != NULL)
    /* La saisie est complète: on remplace '\n' par '\0' */
    	             *pc = '\0';
    Si j'ai bien compris si *pc!=null tu vires le retour chariot par \0 (fin de chaine) pour netoyer le tampon
    Pourquoi tu dis *pc alors qu'il est écrit pc ? Problème de vue ?
    2) pourquoi si *pc=Null ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    else /* La saisie a été tronquée: on vide le tampon de stdin */
    	         {
    	             int c;
    	  /* fgetc lit le caractère courant du flux int fgetc(FILE * flux)   */      
    	             while ((c = fgetc(stream)) != '\n' && c != EOF)
    	             {
    	                 /* Cette boucle ne fait rien */
    	                  continue;
    	             }
    	         }
    	     }
    	 }
    Et là je comprends pas; car si *pc = Null tu devrais rien trouver dans le tampon niveau" \n" puisque tu codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     /* On teste la présence du caractère de fin de ligne */
    	         char *pc = strchr(s_buffer, '\n');
    pour tester de la présence ou pas de "\n"
    Tu devrais reprendre le code et en analyser l'algorithme. Il est très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    On cherche le '\n'
    Si on l'a trouvé, 
     on l'élimine
    Sinon
     on lit tous les caractères non lus jusqu'au \n
    C'est pas plus compliqué que ça.

  9. #29
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pourquoi tu dis *pc alors qu'il est écrit pc ? Problème de vue ?

    Tu devrais reprendre le code et en analyser l'algorithme. Il est très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    On cherche le '\n'
    Si on l'a trouvé, 
     on l'élimine
    Sinon
     on lit tous les caractères non lus jusqu'au \n
    C'est pas plus compliqué que ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     int c;
    	  /* fgetc lit le caractère courant du flux int fgetc(FILE * flux)   */      
    	             while ((c = fgetc(stream)) != '\n' && c != EOF)
    Merçi pour ta réponse, pour ce qui est de ma vue non j'y voies bien l' "*" devant pc était pour rappeler à mon interlocuteur que je parlais d'un pointeur. Pour ce qui est de ton explication sur l'algo OK merçi,par moment on se complique un peu la vie ... par contre juste une petite question si je rentre deux caractères différents de "\n" int c prendra quellle valeur? le code ascii du 1er caractère ou du second ou des deux ?
    Merçi beaucoup pour ton aide A +

  10. #30
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par xeron33 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     int c;
    	  /* fgetc lit le caractère courant du flux int fgetc(FILE * flux)   */      
    	             while ((c = fgetc(stream)) != '\n' && c != EOF)
    Merçi pour ta réponse, pour ce qui est de ma vue non j'y voies bien l' "*" devant pc était pour rappeler à mon interlocuteur que je parlais d'un pointeur. Pour ce qui est de ton explication sur l'algo OK merçi,par moment on se complique un peu la vie ... par contre juste une petite question si je rentre deux caractères différents de "\n" int c prendra quellle valeur? le code ascii du 1er caractère ou du second ou des deux ?
    Merçi beaucoup pour ton aide A +
    Attention à ne pas confondre pc et *pc. La première expression est de type pointeur sur char, tandis que la deuxième est de type char. Je rappelle que NULL n'a un sens que pour un pointeur.

    En ce qui concerne l'algo, où as-tu l'impression qu'on se complique la vie?

    Lorsque tu réalises une opération de saisie avec fgets(), tu entres forcément un caractère de fin de ligne. C'est ce qui te sert à valider ton entrée. fgets() te permet de saisir la ligne entrée au clavier et validée par la touche ENTER. Les caractères saisis sont ensuite placés dans la chaine de caractères passée en 1er argument de fgets() (J'appelle cette chaine le tampon de saisie).

    Jusque là, c'est OK?

    Si la ligne entrée par l'utilisateur peut être stockée complètement dans le tampon de saisie, toute est OK et l'opération de saisie est complète. Le tampon de saisie contient donc maintenant la chaine entrée par l'utilisateur terminée par les caractères '\n' puis '\0'. fclean() ne fait alors rien d'autre que de remplacer le caractère '\n' par un deuxième caractère nul '\0'.

    Si, au contraire, l'utilisateur a entré un texte trop long pour être stocké dans le tampon de saisie, l'opération de saisie sera incomplète. Un certain nombre de caractères seront placés dans ce tampon, et ceux qui n'ont pas pu être saisis resteront dans le tampon du flux d'entrée standard (stdin) en attendant un appel ultérieur à fgets() ou fgetc() ou autre. Lors de l'appel à fclean(), le caractère '\n' n'est pas trouvé (puisque ce dernier se trouve toujours dans le tampon du flux d'entrée standard). pc (de type pointeur sur char) reçoit donc la valeur NULL. Dès lors, on saisit et on ignore un à un chaque caractère restant dans le tampon de stdin afin de purger ce dernier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int c;
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
    {
    }
    Ceci n'est pas une complication inutile. Cela permet de repartir avec un flux d'entrée standard vide lors du prochain appel à fgets() ou toute autre fonction de saisie.

    En fin de compte, la fonction fclean() est relativement aisée à comprendre et à développer, et permet de se simplifier la vie par la suite en s'assurant que le tampon du flux d'entrée standard est nettoyé après chaque opération de saisie.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #31
    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 xeron33 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     int c;
    	  /* fgetc lit le caractère courant du flux int fgetc(FILE * flux)   */      
    	             while ((c = fgetc(stream)) != '\n' && c != EOF)
    Merçi pour ta réponse, pour ce qui est de ma vue non j'y voies bien l' "*" devant pc était pour rappeler à mon interlocuteur que je parlais d'un pointeur.
    Pour ça, on a pris la précaution de nommer l'objet pxxx (ou p_xxx). Ici, p tout cours...

    p est le pointeur
    *p est l'objet pointé.

    Rien à voir ! De plus, si p vaut NULL, *p invoque un comportement indéterminé.

    si je rentre deux caractères différents de "\n" int c prendra quellle valeur? le code ascii du 1er caractère ou du second ou des deux ?

    c pendra les valeurs successife des caractères lus, y compris '\n', qui sera le dernier (ou EOF si on lit à partr d'un fichier...).

    Pour comprendre le fonctionnement de fgetc() :

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc

    C'est un peu avancé. Si tu ne comprends pas tout, relis le un peu plus tard...

  12. #32
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Attention à ne pas confondre pc et *pc. La première expression est de type pointeur sur char, tandis que la deuxième est de type char. Je rappelle que NULL n'a un sens que pour un pointeur.
    <...>
    Merci à toi pour toutes tes explications A +

  13. #33
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Merçi à toi Emmanuel pour ton aide précieuse j'ai mis en gras une quetion par apport à ta dernière comtribution A +
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pour ça, on a pris la précaution de nommer l'objet pxxx (ou p_xxx). Ici, p tout cours...

    p est le pointeur
    *p est l'objet pointé.
    si je définis :
    c'est bien une variable char de type pointeur ? t'es OK ?

    Rien à voir ! De plus, si p vaut NULL, *p invoque un comportement indéterminé.

    si je rentre deux caractères différents de "\n" int c prendra quellle valeur? le code ascii du 1er caractère ou du second ou des deux ?

    c pendra les valeurs successife des caractères lus, y compris '\n', qui sera le dernier (ou EOF si on lit à partr d'un fichier...).

    Pour comprendre le fonctionnement de fgetc() :

    http://emmanuel-delahaye.developpez.com/notes.htm#fgetc

    C'est un peu avancé. Si tu ne comprends pas tout, relis le un peu plus tard...

  14. #34
    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 xeron33 Voir le message
    Merçi à toi Emmanuel pour ton aide précieuse j'ai mis en gras une quetion par apport à ta dernière comtribution A +
    Oui, le C, c'est subtil. Le sens de '*' dépend du contexte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    T *p : définition d'un pointeur sur un objet de type T.
    *p : déréférencement du pointeur.
    opérande * opérande : multiplication.

  15. #35
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Salut Emmanuel merçi encore !
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Oui, le C, c'est subtil. Le sens de '*' dépend du contexte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    T *p : définition d'un pointeur sur un objet de type T.
    *p : déréférencement du pointeur.C'est quoi le déréférencement ?
    opérande * opérande : multiplication.
    A +

  16. #36
    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 xeron33 Voir le message
    C'est quoi le déréférencement ?
    (J'ai failli ne pas voir la question...)

    C'est l'action de lire ou d'écrire une donnée via un pointeur. C'est un peu le B.A. BA des pointeurs...

  17. #37
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    =
    *p : déréférencement du pointeur.C'est quoi le déréférencement ?

    Emmanuel Delahaye;2474986](J'ai failli ne pas voir la question...)

    C'est l'action de lire ou d'écrire une donnée via un pointeur. C'est un peu le B.A. BA des pointeurs...
    ok par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char * p;
    * p='c';
    ok ?
    Salut A +

  18. #38
    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 xeron33 Voir le message
    ok par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char * p;
    * p='c';
    ok ?
    Salut A +
    Ben non, car on ne sait pas où pointe p. Le comportement est indéfini.
    Il y a une chose importante à savoir avec les pointeurs, c'est qu'il ne doit jamais avoir une valeur indéterminée.

    Soit il est invalide (déréférencement interdit) et on lui donne pour valeur NULL,
    Soit il est valide et il tire sa valeur d'une des 4 possibilités de bases suivantes :
    • adresse d'une variable
    • contenu d'un pointeur valide
    • valeur retournée par malloc()
    • valeur retournée par fopen() (type FILE *)

    ce qui permet de le tester le pointeur avant usage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (p != NULL)
    {
       /* j'ai le droit de dereferencer */
    }
    else
    {
       /* je n'ai pas le droit de dereferencer */
    }
    c'est aussi simple que ça.

    Quand un pointeur devient invalide, on le force à NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       free (p), p = NULL;
     
       fclose (fp), fp = NULL;
    etc.

    http://emmanuel-delahaye.developpez.....htm#pointeurs

  19. #39
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 896
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Il y a une chose importante à savoir avec les pointeurs, c'est qu'il ne doit jamais avoir une valeur indéterminée.
    bonsoir Emmanuel
    1)comment un pointeur devient invalide?
    2)tu codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       free (p), p = NULL;
    d'après le manuel en ligne :
    free - Afficher les quantités de mémoires libres et utilisées.
    ma question quel est le but içi ?

    A +

  20. #40
    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 xeron33 Voir le message
    [B][I]bonsoir Emmanuel
    1)comment un pointeur devient invalide?
    Quand l'objet pointé n'est plus valide, par exemple, suite à la libération du bloc pointé. On matérialise cet état en lui donnant la valeur NULL. C'est une opération volontaire du (bon) codeur.

    2)tu codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       free (p), p = NULL;
    d'après le manuel en ligne :
    free - Afficher les quantités de mémoires libres et utilisées.
    Tu te trompes de manuel. Celui de la bibliothèque C est le 3 (free(3))

    http://man.developpez.com/man3/free.3.php

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Problème boucle while + boucle simple
    Par horit dans le forum Général Python
    Réponses: 2
    Dernier message: 26/11/2013, 09h45
  2. Boucle while & read
    Par gibet_b dans le forum Linux
    Réponses: 4
    Dernier message: 29/04/2005, 15h38
  3. boucle while et post incrémentation
    Par tut dans le forum C++
    Réponses: 7
    Dernier message: 10/12/2004, 17h24
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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