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 :

Static void? Informations sur le sujet.


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 64
    Points
    64
    Par défaut Static void? Informations sur le sujet.
    Bonjour,

    J'utilise la procédure fournit dans la FAQ:

    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
    
    staticvoid clean (char *s, FILE *fp)
    {
    char *p = strchr (s, '\n'); //Recherche du caractère 'chariot' dans la chaine 's'
    // Si p!=Null alors le caractère est trouvé, alors on le détruit...
    if (p != NULL)
    {
    *p = 0;
    }
    else
    {
    // Le caractère n'a pas été trouvé, on purge le buffer ...
    fflush(fp); 
    }
    }
    
    enfin je l'ai un peu modifié...

    Bref, je ne comprends pas bien à quoi sert le static void... J'ai lu une explication dans la FAQ mais elle explique pour les variables or la c'est pour une procédure... Le problème est que je présente mes applications à un jury pour mon BTS dans une semaine et je dois être au point sur tout ce que j'utilise dans mon code...

    merci par avance

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ca spécifie tout simplement que cette fonction est privée au module (static) et ne renvoie pas de valeur (void) ... c'est une fonction locale à un module de code !

    Et ... ha oui, il n'y a pas de procédure en C, que des fonctions !

  3. #3
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    1. Oubli pas l'espace entre static et void
    2. le modificateur static permet de réduire la portée de la fonction au fichier où elle est déclarée.
    3. void indique qu'aucune valeur ne sera retournée à la fin de la fonction

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 64
    Points
    64
    Par défaut
    Impressionant la rapidité dans ce forum

    Donc cette procédure ne sera utilisable que dans le fichier principale... ?

    Ce n'est pas indispensable si j'ai bien compris

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Remedy
    Impressionant la rapidité dans ce forum

    Donc cette procédure ne sera utilisable que dans le fichier principale... ?

    Ce n'est pas indispensable si j'ai bien compris
    Pas vraiment indipensable mais mieux pour la lecture du code et puis encore une fois, en C il n'y a que des fonctions, pas de procédures !

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par Remedy
    Impressionant la rapidité dans ce forum

    Donc cette procédure ne sera utilisable que dans le fichier principale... ?

    Ce n'est pas indispensable si j'ai bien compris
    A partir du moment ou ta fonction n'est utilisée que dans un seul ficher, autant la mettre en static.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 64
    Points
    64
    Par défaut
    merci hiko j'ai posté avant de voir ta réponse...

    merci franck pour la précision, j'avais oublié qu'il n'y a que des fonctions... C'est un coup à se faire démonter par le jury une boulette comme ça!!!

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 64
    Points
    64
    Par défaut
    bon merci à tous, je crois que je peux mettre résolu

    Le topic le plus rapide de mon existence

    A bientôt!

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Remedy
    J'utilise la procédure fournit dans la FAQ:

    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
    
    staticvoid clean (char *s, FILE *fp)
    {
    char *p = strchr (s, '\n'); //Recherche du caractère 'chariot' dans la chaine 's'
    // Si p!=Null alors le caractère est trouvé, alors on le détruit...
    if (p != NULL)
    {
    *p = 0;
    }
    else
    {
    // Le caractère n'a pas été trouvé, on purge le buffer ...
    fflush(fp); 
    }
    }
    
    enfin je l'ai un peu modifié...
    Tes commentaires sont faux. Ce n'est pas 'chariot' que l'on cherche mais '\n'. Point. (peu importe ce que c'est en réalité)

    Tu t'es permi de modifier la fonction, tu n'aurais pas dû. Si tu ne comprends pas le code, demande des explications au lieu de modifier à tord et à travers (fflush() n'est défini que pour les flux sortants). Mon code original est :
    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
     
    static void purge (FILE * fp)
    {
       int c;
       while ((c = fgetc (fp)) != '\n' && c != EOF)
       {
       }
    }
     
    static void clean (char *s, FILE * fp)
    {
       /* search ... */
       char *p = strchr (s, '\n');  /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          purge (fp);
       }
    }
    Si tu le modifies, le fonctionnement n'est plus garanti.

    Bref, je ne comprends pas bien à quoi sert le static void...
    • void pour dire que la fonction ne retourne rien
    • static pour dire qu'elle n'est pas exportée. (n'est connue que de ce module). Tu peux retirer le static si elle est utilisée dans plusieurs modules. Il faut alors évidemment créer un header avec les prototypes, l'inclure où il faut...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 64
    Points
    64
    Par défaut
    Tes commentaires sont faux. Ce n'est pas 'chariot' que l'on cherche mais '\n'. Point. (peu importe ce que c'est en réalité)
    En effet, cependant les commentaires sont purement indicatif et dans le cas présent, le caractère '\n' est bien le caractère chariot qui crée un saut de ligne... Donc je vois pas où est le pb...

    Tu t'es permi de modifier la fonction, tu n'aurais pas dû.
    Oui je me suis permis, ne la mets pas dans la FAQ si tu ne veux pas qu'on la modifie dans son utilisation. Je débute en C, il est normal que j'essaye et que je me trompe.

    De plus, dans la même FAQ il est précisé que pour vider le buffer:
    N.B. : certains compilateurs offre une extension proposant une méthode 'simple' pour vider ce buffer clavier en utilisant la fonction fflush.
    fflush(stdin);
    Alors soit c'est ma modif qui est fausse et alors cette précision dans la FAQ
    est fausse aussi ou alors c'est ta remarque.

    Sinon merci pour le reste de tes commentaires qui sont très précis.

    Un peu moins agressif ça aurait été plus agréable...

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Remedy
    De plus, dans la même FAQ il est précisé que pour vider le buffer:
    N.B. : certains compilateurs offre une extension proposant une méthode 'simple' pour vider ce buffer clavier en utilisant la fonction fflush.
    fflush(stdin);
    Alors soit c'est ma modif qui est fausse et alors cette précision dans la FAQ
    est fausse aussi ou alors c'est ta remarque.
    Non, la precision dans la FAQ n'est pas fausse, elle dit bien "Certains compilateurs offre une extension" ce qui indique clairement que ce n'est pas garantie par le langage (c'est une extension du compilateur) et que ce n'est pas universelle (seuls certains compilateurs la propose). De plus elle precise bien la limite de cette pratique :

    Citation Envoyé par FAQ
    Toutefois la norme n'indiquant le fonctionnement de fflush que sur des flux sortant, cette méthode n'est pas standard et peut conduire à des résultats indéfinis, il convient donc de l'éviter.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Remedy
    En effet, cependant les commentaires sont purement indicatif et dans le cas présent, le caractère '\n' est bien le caractère chariot qui crée un saut de ligne... Donc je vois pas où est le pb...
    Je te trouve bien sûr de toi pour un débutant. Il n'y a pas de caractère 'chariot'. Il y a le caractère 'retour chariot' (CR ou Carriage Return) qui est '\r' et il y a le le caractère 'nouvelle ligne' (LF ou Line Feed) qui est '\n', du moins en mode 'raw' (fichier ouvert en binaire : "rb", "wb" etc.).

    Lorsqu'un fichier est ouvert en mode texte ("r", "w"...), on a que '\n' pour délimiter les lignes et ce caractère peut correspondre à
    CR, LF, CRLF LFCR etc. dans le fichier. Ca dépend du système. C'est ce qu'on appelle une 'abstraction'. C'est ce qui rend le code portable.

    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Oui je me suis permis, ne la mets pas dans la FAQ si tu ne veux pas qu'on la modifie dans son utilisation.
    Pour la petite histoire, ce n'est pas moi qui l'ai mise (je n'ai pas ce pouvoir). Je suis même étonné qu'elle y soit sans qu'on me l'ai demandé... Mais tu n'y es évidemment pour rien.
    Je débute en C, il est normal que j'essaye et que je me trompe.

    De plus, dans la même FAQ il est précisé que pour vider le buffer:
    Alors il fallait préciser le contexte. Sans contexte, on cherche à écrire du code portable, donc indépendant de considérations du genre 'sur certaines plateformes...'
    Alors soit c'est ma modif qui est fausse et alors cette précision dans la FAQ
    est fausse aussi ou alors c'est ta remarque.
    Ta modif est fausse dans un contexte général de code portable. Elle fonctionne peut être sur certaines plateformes, mais quel intérêt puisqu'il existe (au moins) une alternative portable ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 64
    Points
    64
    Par défaut
    c'est vrai qu'une version portable est à privilégier. J'ai choisi d'utiliser la fonction fflush() car si le jury me posait la question sur son rôle, il me semblait plus simple de lui expliquer qu'elle purger le buffer que de lui expliquer en détail l'utilisation du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static void purge (FILE * fp)
    {
       int c;
       while ((c = fgetc (fp)) != '\n' && c != EOF)
       {
       }
    }
    Mais je vous fais confiance et je vais mettre ce code...
    Je me permets encore de poser quelques questions je n'ai pas le droit à l'erreur lors de mon exam... la fonction purge vide le buffer, mais je comprends pas bien comment. Tant que le caractère récupéré dans fp n'est pas le caractère '\n', et que ce n'est pas la fin de fichier, on fait quoi? pour être franc, je ne comprends pas pourquoi la boucle est vide... c'est la première fois que je vois ça... j'ai honte lol

  14. #14
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    J'ai eu beau chercher dans la FAQ je n'ai pas trouvé...

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Skyrunner
    J'ai eu beau chercher dans la FAQ je n'ai pas trouvé...
    http://c.developpez.com/faq/c/?page=...buffer_clavier

  16. #16
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Je parlai de la fonction clean de Emmanuel car d'apres le premier post, Remedy a trouve cette fonction dans la FAQ.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Remedy
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static void purge (FILE * fp)
    {
       int c;
       while ((c = fgetc (fp)) != '\n' && c != EOF)
       {
       }
    }
    la fonction purge vide le buffer, mais je comprends pas bien comment.
    Ce qui est appelé à chaque tour, c'est fgetc().
    Qui fait quoi ? Qui extrait un caractère du flux entrant.

    On s'arrête si on tombe sur '\n' ou sur EOF. Rien de bien mystérieux.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Skyrunner
    Je parlai de la fonction clean de Emmanuel car d'apres le premier post, Remedy a trouve cette fonction dans la FAQ.
    Je pense qu'il a confondu avec 'le forum'...

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 12/12/2004, 14h25
  2. Réponses: 6
    Dernier message: 28/04/2004, 10h41
  3. Réponses: 3
    Dernier message: 01/02/2004, 21h24
  4. Informations sur les procédures stockées
    Par jfphan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/01/2004, 14h30
  5. Réponses: 6
    Dernier message: 28/09/2003, 17h49

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