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 :

petit soucis dans le main..


Sujet :

C

  1. #1
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut petit soucis dans le main..
    Bonsoir , j'ai écrit un programme qui m'affiche la longueur de chaque ligne rencontrée en entrée , pour ce ci j'ai 2 fichiers , une fonction lireligne qui affiche la longueur d'une ligne , et un programme main pour l'éxécuter , voici les codes :

    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
     
     
    /* fonction */
    #include <stdio.h>
     
    int lireligne(char s[], int lim)
    {
       int c, i;
     
       for ( i=0; i < lim - 1 && (c=getchar()) != EOF && c!='\n'; ++i)
          s[i] = c;
       if ( c == '\n' )
       {
          s[i] = c;
          ++i;
       }
       s[i] = '\0';
       return i;
    }
    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
     
    int lireligne(char ligne[], int taille);
     
    int main(void)
    {
       int l = 0;
       int c;
     
       while ((c=getchar() !=EOF && lireligne > 0 )
       {
          if ( c == '\n' )
             ++l;
          else
             l = 0;
       }
       printf("%d\n", l);
    }
    message d'erreur pour la compilation :

    main.c : warning ordered comparaison of pointer with integer zero , control reaches end of non void function .
    Est ce que par hasard çà serait parce que j'ai oublié le return 0 ?
    merci

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: petit soucis dans le main..
    Citation Envoyé par Bibouda
    Est ce que par hasard çà serait parce que j'ai oublié le return 0 ?
    Oui

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu compares une fonction (son adresse pas son résultat) à zéro, et oui, tu as oublié des return 0 par endroits...

  4. #4
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    alors médinoc comment comparer le résultat qui est dans la fonction , à 0 , au lieu de comparer son adresse à 0 , et au passage pourquoi quand j'écris lireligne > 0 c'est traduit comme adresse de lireligne > 0?
    Moi je veux que le résultat retourné par lireligne soit > 0 ...

    merci

  5. #5
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Hum... bizarre que tu ne comprennes pas ça quand même
    lireligne c'est l'adresse. Tu peux donc créer un pointeur sur fonction et faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int (*ptr) (char *, int);
    ptr = lireligne ;
    Mais toi, tu veux le résultat de la fonction. Donc il faut l'appeler et utiliser les parenthèses et les paramètres de celle-ci... Ca donnerait un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lireligne(s,n) > 0
     
    // s étant un char[]
    // n étant un int
    C'est basique tout ça...

    Nas'

  6. #6
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    excuse moi j'ai pas encore vu les pointeurs..interdiction d'en utiliser , j'ai corrigé et çà marche pas encore , je comprends pas ( mon livre est très mal fait , le langage C norme ansi de k&r , trop dur pour débuter ) :

    donc j'ai remplacé et j'ai tjs erreur de compilation :


    while ((c=getchar() !=EOF && lireligne(ligne, taille) > 0 )

    erreur :

    'ligne' undeclared.....
    taile undeclared.....

    je comprends pas , faut déclarer les arguments ? pourquoi vu que les arguments sont déjà déclarés sur la 1ere ligne :

    int lireligne(char ligne[], int taille);

  7. #7
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    Oula... t'as un GROS problème là si tu ne comprends pas ça

    Je te conseille de prendre un cours sur Developpez, bien que le livre que tu poosèdes soit très bien (mais il faut relire plusieurs fois les choses pour bien comprendre au début).

    La première ligne te donne le prototype c'est à dire le nom de la fonction, le type de retour et le type des arguments (même si on peut y faire figurer le nom).
    Mais une fois que tu veux utiliser la fonction ( <=> appeler la fonction), il faut avoir déclaré les arguments à passer, bien évidemment!

    Nas'

  8. #8
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    hé hé , alors j'ai remplacé et j'ai tjs une erreur de compilation :

    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
     
    int lireligne(char ligne[], int taille);
     
    int main(void)
     
    {
     
    int l = 0;
    int c;
    char ligne[];
    int taille;
     
    while ((c=getchar() !=EOF && lireligne(ligne, taille) > 0 )
    {
    if ( c == '\n' )
    ++l;
    else
    l = 0;
    }
     
    printf("%d\n", l);
    }
    erreur de compilation :

    error array size missing in ligne .


    çà veut dire qu'il faut que je définisse une taille maximale à mon tableau (ligne) je parie , genre je rahoute cette ligne :

    #define MAXILGNE 250

    et dans la déclaration je mets

    char ligne[MAXLIGNE] , non?

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    çà veut dire qu'il faut que je définisse une taille maximale à mon tableau (ligne) je parie , genre je rahoute cette ligne :
    #define MAXILGNE 250
    et dans la déclaration je mets
    char ligne[MAXLIGNE] , non?
    Oui
    excuse moi j'ai pas encore vu les pointeurs..interdiction d'en utiliser ,
    Il y a de drôle de prof tout de même! (et ce sont des collègues !!! )
    Toutefois, vu ta manière de gérer les fonctions, il y a des choses qu'il te faut revoir de toute urgence!
    Bonne continuation

  10. #10
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    ben tu peux blamer denis ritchie , le créateur du langage C , car cet exercice est de lui , dans son livre 2eme édition , au passage j'ai laissé un message de le forum algorithmique en rapport total avec cet exercice , si quelqu'un veut jeter un oeil , c'est en rapport avec le C

  11. #11
    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 Re: petit soucis dans le main..
    Citation Envoyé par Bibouda
    voici les codes :
    Merci de ne pas recopier le code à la main, mais de le copier/coller
    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
     
    Compiling: main.c
    main.c:11: warning: no previous prototype for 'lireligne'
    main.c: In function `main_':
    main.c:30: warning: ordered comparison of pointer with integer zero
    main.c:31: error: syntax error before '{' token
    main.c:27: warning: unused variable `l'
    main.c: At top level:
    main.c:37: error: syntax error before string constant
    main.c:37: warning: type defaults to `int' in declaration of `printf'
    main.c:37: warning: function declaration isn't a prototype
    main.c:37: error: conflicting types for 'printf'
    main.c:37: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:37: error: conflicting types for 'printf'
    main.c:37: note: a parameter list with an ellipsis can't match an empty parameter name list declaration
    main.c:37: warning: data definition has no type or storage class
    Process terminated with status 1 (0 minutes, 0 seconds)
    On pert du temps là...

    Pourquoi du code aussi compliqué ?

    [EDIT]
    Oups, j'ai besoin de vacances là... Que des bétises aujourd'hui... J'avais compris "compter les lignes"... Désolé.

  12. #12
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    alors là je n'ai rien comprs à ton message lol , enfin mon code ne fait pas ce que j'essaye de faire en tout cas , mon code me prend une chaine en entrée et me retourne le chiffre 0 quand j'appuie sur la touche entrée , pourtant l'algo que j'ai en tête m'a l'air juste :

    On parcourt la ligne ( qui n'est autre qu'un tableau de caractère ), on compte les caractères avec une fonction déjà programmée . Donc si on a n caractère à la 1ere ligne , j'incrémente la case 0 d'un tableau de n et j'affiche la valeur de la case 0 , si j'ai n caractère à la 2eme ligne , j'incrémente la case 1 n fois ...


    Le programme doit donner ceci :


    blabla
    youp
    kikikikiki

    6 4 10 ( la ligne 1 a 6 lettres , la 2 a 4 lettres ... )

  13. #13
    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 Bibouda
    alors là je n'ai rien comprs à ton message lol
    Oui, j'avais mal compris. Oublie ça, désolé.

    Bon voilà une version plus simple de ton affaire...
    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
     
    #include <stdio.h>
     
    int lireligne(char s[], int lim)
    {
       int i = 0;
       int c;
     
       while ((c = getchar()) != EOF && c != '\n')
       {
          if (i < lim - 1)
          {
             s[i] = c;
             ++i;
          }
       }
       s[i] = '\0';
     
       return i;
    }
     
    int main(void)
    {
       int n = 0;
       char s[123];
     
       while ((n = lireligne(s, sizeof s)) != 0)
       {
          printf("%d\n", n);
       }
     
       return 0;
    }
    Ca compte les longueurs de lignes à la volée...

  14. #14
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    blabla
    youp
    kikikikiki
    6 4 10 ( la ligne 1 a 6 lettres , la 2 a 4 lettres ... )
    N'est ce pas donc plutot
    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
    int main()
    {
       int l = 0;
       int c;
       while ((c = getchar()) != EOF)
       {
          if (c != '\n')++l;
          else
          {
            printf("%d\n", l);
            l=0;
           }
       }
       return 0;
    }

  15. #15
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    non car je dois utiliser la fonction lireligne , dont j'ai mis le code dans le 1er post , juste au dessus

  16. #16
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    emmanuel , interdiction d'utiliser sizeof en ce qui me concerne

  17. #17
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    non car je dois utiliser la fonction lireligne , dont j'ai mis le code dans le 1er post , juste au dessus
    Fais un effort tout de même!!!!!
    On veut bien aider pas faire ton job. Le code analyse à ta convenance une chaîne de caractères lue au clavier. Tu dois pouvoir l'adapter pour une chaîne placée dans un tableau par ta fonction lireligne ou au minimum tu peux essayer de le faire. Si tu n'y arrives pas, alors on t'aideras.
    Bonne nuit

  18. #18
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    pourquoi ce code que j'ai fait ne va pas alors :

    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
     
    int lireligne(char ligne[], int taille);
     
    int main(void)
    {
       int l = 0;
       int c;
    char ligne[150];
    int taille;
     
       while ((c=getchar() !=EOF && lireligne(ligne, taille) > 0 )
       {
          if ( c == '\n' )
             ++l;
          else
             l = 0;
       }
       printf("%d\n", l);
    return 0;
    }

  19. #19
    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 Bibouda
    pourquoi ce code que j'ai fait ne va pas alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char ligne[150];
    int taille;
    <...>
       while ((c=getchar() !=EOF && lireligne(ligne, taille) > 0 )
    La variable 'taille' n'est pas initialisée. Passer une valeur indéfinie à une fonction invoque un comportement indéfini. Autrement dit, c'est un bug.

  20. #20
    Provisoirement toléré
    Inscrit en
    Octobre 2002
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 214
    Points : 33
    Points
    33
    Par défaut
    j'ai corrigé mais mon programme ne donne pas ce que je veux , il prend des caractères en entrée et me retourne un 0 quand j'appuie sur entrée :

    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
     
    int lireligne(char ligne[], int taille);
     
    int main(void)
    {
       int l = 0;
       int c;
    char ligne[150];
    int taille = 0; 
     
       while ((c=getchar() !=EOF && lireligne(ligne, taille) > 0 )
       {
          if ( c == '\n' )
             ++l;
          else
             l = 0;
       }
       printf("%d\n", l);
    return 0;
    }
    pourtant quand je lis le programme en français çà me donne :

    tant que c prend un caractère différent de EOF , et que le nombre de caractères est supérieur à 0 , et si le caractère est un passage à la ligne , alors on incrémente l ( qui est la longueur d'une ligne ) , sinon on dit que l = 0 , et ensuite on affiche la valeur de la ligne , alors qu'est ce qui va pas?

    Mon idée : je pense que mon programme ne prend en compte que une ligne ( donc j'ai mal fait ma boucle ou sa structure j'en sais rien ) .

Discussions similaires

  1. petit souci dans mon code
    Par Cyang dans le forum Débuter
    Réponses: 3
    Dernier message: 05/07/2010, 12h30
  2. Petit soucis dans mon programme/compilation
    Par alessandro67 dans le forum C
    Réponses: 10
    Dernier message: 23/02/2009, 17h19
  3. un petit souci dans mon script !
    Par kerberos dans le forum VBScript
    Réponses: 1
    Dernier message: 25/06/2008, 15h42

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