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 :

un programme en c


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut un programme en c
    bonjour tout le monde,j'aimerais bien que vous m'aidiez à comprendre ce à quoi sert ce programme,en fait ce qui m'empeche à le comprendre c'est l 'utilisation de continue et return 1,bon voila le programme que j'ai dans les mains:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<stdio.h>
    main()
     
    {
      int i,j;
      char c;
      for(i=0,j=0;(c= getchar())!=' \n';i++)
        { if(c==' ') continue; 
            j++;}
     printf ("i=%d\n",i);
     printf("i=%d\n",j)
    return 1;
    }

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    Je sais pas à quoi sert ce programme mais je dois dire que c'est de toute beauté
    • mauvaise définition du main(), c'est "int main(void)" (version sans arguments)
    • il manque un point virgule
    • main qui retourne jamais 0 (alors que ça devrait etre le code de retour si tout va bien)
    • on peut souvent se passer de "continue", son utilisation est aussi discutable que goto
    • indentation à la one aigain


    La signification de continue est dans ton bookain de C

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut
    en fait je n'ai fait que copier le programme d'un devoir qui s'est passé l année derniere ,et c'est par un prof en informatique

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut
    1) Que fait-on dans le programme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
     
    main () 
    { int i, j;
      char c;
      for (i = 0, j = 0; (c = getchar()) != ‘\n’; i++)
            {if (c == ‘ ’)  continue;
              j++;
             }
      printf (“i = %d \n”, i);
      printf (“j = %d \n”, j);
      return 1;
    }

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Salut,[*]main qui retourne jamais 0 (alors que ça devrait etre le code de retour si tout va bien)
    hmmm hmmm..

    C'est le fameux cas : est-ce que False est "Non-vrai" ou True est "non-faux" ...


    La seule VRAIE règle est qu'un code de retour négatif est une erreur....

    L'utilisation d'EXIT_SUCCESS et EXIT_FAILURE est légèrement plus portable (vers des environnements non-Unix) que celle de zéro et d'une valeur non-nulle comme 1 ou -1. En particulier, VMS utilise une convention différente
    tout dépend du système utilisé

    et pas exemple, pour fork (appelée par system() ) :

    En cas de succès, le PID du fils est renvoyé au processus parent, et 0 est renvoyé au processus fils. En cas d'échec -1 est renvoyé dans le contexte du parent, aucun processus fils n'est créé, et errno contient le code d'erreur.

  6. #6
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    La seule VRAIE règle est qu'un code de retour négatif est une erreur....
    Je me demande où t'as vu ça..
    Mais c'est vrai qu'il faudrait utiliser EXIT_SUCCESS

    et pas exemple, pour fork (appelée par system() ) :
    Oui mais les fonctions C et le code de retour des programmes c'est pas pareil

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Oui mais les fonctions C et le code de retour des programmes c'est pas pareil
    je répète : un programme C (donc contenant main), appelé via system(), retournera ce qu'on lui aura dit de retourner..

    Et bien entendu que LA fonction C main et le code de retour des programmes est pareil.. Quand tu fais return (ou exit), c'est ce que le système (ou sh ou ksh ou n'importe quel shell) traduira...

    Suivant le shell, si un programme se termine par 1 (ou non zero), pour lui il comprendra succès, ou au contraire erreur.... et réciproquement...

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut
    alors ,pouvez vous me faire comprendre ce programme?

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    bah il compte combien de lettres non-espace ont été rentrées et en combien de caractères tapés (y compris les espaces)

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    bah il compte combien de lettres non-espace ont été rentrées et en combien de caractères tapés (y compris les espaces)
    ça serait trés gentil si vous ma faire comprendre ligne par ligne ce programme et merci!

  11. #11
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    je répète : un programme C (donc contenant main), appelé via system(), retournera ce qu'on lui aura dit de retourner..
    Okay, mais on avait l'impression que tu voulais executer fork() avec un system()

    ça serait trés gentil si vous ma faire comprendre ligne par ligne ce programme et merci!
    Ca serait plus interessant que tu apprenes à analyser les sources par toi meme, surtout que là c'est quand meme pas dur. Si tu peux pas te permettre de lire un bookain sur le C ou chercher sur internet, ptet que ya la reponse à toutes tes questions dans ton cours.

  12. #12
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut
    dans ce programme pourquoi ils ont retourner 1 et non un 0?

  13. #13
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Okay, mais on avait l'impression que tu voulais executer fork() avec un system()


    Ca serait plus interessant que tu apprenes à analyser les sources par toi meme, surtout que là c'est quand meme pas dur. Si tu peux pas te permettre de lire un bookain sur le C ou chercher sur internet, ptet que ya la reponse à toutes tes questions dans ton cours.
    oui peut etre c'est pas dur pour vous ,mais il peut etre dur pour les autres!
    j ai cherché sur internet ,et je sais que je dois chercher ,mais je n'ai rien pigé,il n ya que des difinitions,mais quand j'arrive au programme j'arrive pas à comprendre!
    d 'autre part j ai fait informatique apres mes classes preparatoires ,et je le regrette ,parce que vraiment j'ai pas l'esprit d'informaticien!!
    mais je dois me battre pour comprendre!
    merci!!

  14. #14
    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 souviron34 Voir le message
    La seule VRAIE règle est qu'un code de retour négatif est une erreur....
    Ben non. C'est une convention unixoïde pour les fonctions système. C'est tout ce qu'on peut dire... Attention à ne pas centrer le monde autour de son unique expérience...

    Beaucoup de fonctions retournent 0 pour OK et <> 0 (souvent >0) pour KO. C'est d'ailleurs la règle C pour errno.

    Par exemple, en C standard, fgetc() retourne EOF (int < 0) en cas d'arrêt de la lecture. Ca peut être une fin de fichier (feof() retourne alors 1) ou une erreur (ferror() retourne 1 et on est prié d'aller lire le détail dans errno ou d'utiliser strerror() ou perror()...)

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 962
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 962
    Par défaut
    Gio,
    Citation Envoyé par s-ehtp Voir le message
    oui peut etre c'est pas dur pour vous ,mais il peut etre dur pour les autres!
    j ai cherché sur internet ,et je sais que je dois chercher ,mais je n'ai rien pigé,il n ya que des difinitions,mais quand j'arrive au programme j'arrive pas à comprendre!
    d 'autre part j ai fait informatique apres mes classes preparatoires ,et je le regrette ,parce que vraiment j'ai pas l'esprit d'informaticien!!
    mais je dois me battre pour comprendre!
    merci!!
    Pour un petit programme comme ça, et comme c'est pour apprendre :

    tu te prends par la main avec une feuille de papier, un crayon, et tu fais fonctionner le tout manuellement, en notant la valeur des différentes variables au cours de l'exécution.

    Accessoirement, c'est assez courant de faire ainsi, même pour un programmeur confirmé.

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Okay, mais on avait l'impression que tu voulais executer fork() avec un system()
    parce que le man page (ici même http://man.developpez.com/man3/system.3.php ou http://linux.die.net/man/3/system) le dit....


    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ben non. C'est une convention unixoïde pour les fonctions système. C'est tout ce qu'on peut dire... Attention à ne pas centrer le monde autour de son unique expérience...

    Beaucoup de fonctions retournent 0 pour OK et <> 0 (souvent >0) pour KO. C'est d'ailleurs la règle C pour errno.

    Par exemple, en C standard, fgetc() retourne EOF (int < 0) en cas d'arrêt de la lecture. Ca peut être une fin de fichier (feof() retourne alors 1) ou une erreur (ferror() retourne 1 et on est prié d'aller lire le détail dans errno ou d'utiliser strerror() ou perror()...)
    C'est bien ce que j'ai dit :

    Citation Envoyé par souviron34 Voir le message
    Suivant le shell, si un programme se termine par 1 (ou non zero), pour lui il comprendra succès, ou au contraire erreur.... et réciproquement...
    et je répondais à Gruik :
    main qui retourne jamais 0 (alors que ça devrait etre le code de retour si tout va bien)



    et pour le PO, la réponse à ta question :

    Citation Envoyé par s-ehtp Voir le message
    dans ce programme pourquoi ils ont retourner 1 et non un 0?
    est juste 3 lignes plus haut....

    Sur le système où ton prof a fait son exemple, avec son shell, c'est sans doute que 1 correspond à succès.. Mais comme disait Gruik et la norme, il aurait au moins dû retourner EXIT_SUCCESS...

  17. #17
    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
    0 est une valeur portable pour indiquer le succès de l'exécution. Si le système attend une autre valeur, la traduction est faite par le compilo.

    0, EXIT_SUCCESS et EXIT_FAILURE sont les trois valeurs portables que devrait renvoyer main().

    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++

    +

  18. #18
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut
    Citation Envoyé par droggo Voir le message
    Gio,

    Pour un petit programme comme ça, et comme c'est pour apprendre :

    tu te prends par la main avec une feuille de papier, un crayon, et tu fais fonctionner le tout manuellement, en notant la valeur des différentes variables au cours de l'exécution.

    Accessoirement, c'est assez courant de faire ainsi, même pour un programmeur confirmé.
    la boucle for est ce que on va incrementer le i jusqu'à ce qu on tape un espace?
    la boucle for qui utilise i et j comme dans cette exemple et ce deux compteur qui travailleent en meme temps ,?

  19. #19
    Membre éclairé
    Inscrit en
    Octobre 2007
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 285
    Par défaut
    ces mots shell,fgetc,exit_success .... vraiment je savais pas de quoi vous parlez!
    je suis q'un debutant qui est en train de se galerer avec des tout petits programmes! (ça fait que 4 mois que j'ai commencé l'informatique!)

  20. #20
    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 s-ehtp Voir le message
    ces mots shell,fgetc,exit_success .... vraiment je savais pas de quoi vous parlez!
    je suis q'un debutant qui est en train de se galerer avec des tout petits programmes! (ça fait que 4 mois que j'ai commencé l'informatique!)
    Bah c'est un peu à toi d'augmenter tes connaissances par toi même... pour 'shell', Wikipédia est un bon début...

    Ensuite, pour fgetc(), c'est une fonction standard de la bibliothèque du langage C. Déscription dans ton livre de C ou sur htpp://man.developpez.com.

    Enfin EXIT_SUCCESS est une des valeurs standard que le programme peut renvoyer au système, soit en quittant main(), soit par la fonction exit(). Elle est définie dans <stdlib.h>

Discussions similaires

  1. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  2. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  3. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  4. Comment débuter en programmation ?
    Par Marc Lussac dans le forum Débuter
    Réponses: 0
    Dernier message: 08/04/2002, 11h29
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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