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. #21
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Sans vraiment regarder le code, si tu as une fonction lireligne, je suppose que le premier argument est la chaîne de caractères et le deuxième la taille du tableau (donc le maximum d'éléments qu'on peut mettre dedans...), en principe il faudrait plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //avec un const, c'est tellement mieux
    const int taille = 150;
    char ligne[taille];
    ou alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Meme un define c'est mieux!
    #define TAILLE 150
    ....
    char ligne[TAILLE];
    ...

  2. #22
    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
    revoici le code de la fonction lireligne si tu veux plus de précisions sur ce qu'elle fait :

    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
     
    /* 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;
    }

  3. #23
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Un bug de logique, tu récupères le '\n' dans lireligne et apres t'esperes encore le récupérer dans ton main...

    En supposant que je ne touche pas à lireligne...

    Ton main devrait être (pas testé par contre):

    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
     
    int main(void)
    {
       int l = 0;
       int c;
       const int taille = 150;
       char ligne[taille];
     
       while ((c=getchar() !=EOF))
       {
         l =  lireligne(ligne, taille); 
        //on incremente d'un pour récupérer le caractere lu par getchar
         ++l;
        //on affiche la taille de cette ligne
        printf("%d\n", l);
       }
    return 0;
    }
    EDITION: remarquez que mon ++l prend en compte le '\n' ce qui n'est pas forcément voulu... Suffirait de l'enlever sinon...

    PS: par contre, c'est mal habile et ta fonction lireligne n'est pas utile dans le sens ou elle remplit un tableau qui n'est même pas utilise...

  4. #24
    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
    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 :
    Normal, tu lui dis de prendre 0 caractères.
    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;
    }
    Tu penses que de passer une taille de 0 à la fonction, c'est correct ? Quel est le rôle de ce paramètre ? As-tu compris comment fonctionnait lireligne() ? Tout laisse penser que tu as récupéré cette fonction sans savoir à quoi elle sert ni comment on s'en sert..

    Autre chose, dans le while(...), à quoi sert le '(c=getchar() !=EOF)' ? C'est pas déjà fait dans lireligne(), ça ?

  5. #25
    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
    oui évidemment mais tu m'as dit d'initialiser la variable taille , donc je 'lai mise à 0 , maintenant la fonction lireligne je sais ce qu'elle fait , elle renvoit le nombre de caractère contenus dans un tableau de caractères ( une ligne ) , alors :

    le while ( lireligne(ligne, taille) > 0 ) ne veut rien dire si j'ai bien compris?

    le taille dans cette fonction c'est la valeur qu'elle retourne , mais je dis bien qu'elle est supérieure à 0 , et c'est la variale l qui compte les caractères , je m'emmèle les pinceaux là , tu me dis que mon code prend 0 caractère mais je comprends pas pourquoi...

  6. #26
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Le for dans ta fonction lireligne est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( i=0; i < lim - 1 && (c=getchar()) != EOF && c!='\n'; ++i)
    Quand tu l'appelles tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     while ((c=getchar() !=EOF && lireligne(ligne, taille) > 0 )
    Or taille = 0 donc finalement ta fonction lireligne ne fait rien...

    Jc

  7. #27
    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
    donc il faut que ma fonction lireligne dans le main me compte les caractères de toutes les lignes , et si je faisais comme çà qu'en penses tu :

    while ( l = lireligne(ligne,taille) > 0)

    c'est mieux je crois mais il reste à définir taille , et je ne sais vraiment pas quelle valeur lui donner...

  8. #28
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Comme beaucoup de fonctions qui ont un tableau en argument, il faut donner la taille de celui-ci pour eviter les depassements memoires, comme je l'ai deja dit dans un precedent post, tu donnes a la variable taille la taille du tableau, ie le nombre d'elements du tableau...

  9. #29
    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
    avec ce code :

    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
     
     
    int lireligne(char ligne[], int taille);
    int main(void)
    {
       int l = 0;
       int c;
       char ligne[taille];
       int taille = 150;
     
       while ((c=getchar() !=EOF))
       {
         l =  lireligne(ligne, taille);
         ++l;
        printf("%d\n", l);
       }
    return 0;
    }
    j'ai cette erreur à la compilation :

    taille undeclared .... unused variable ligne...

    et fear , emmanuel a dit dans un post plus haut que le c = getchar() dans le while n'était pas nécessaire vu que lireligne utilise déjà getchar , qu'en penses tu?
    merci

  10. #30
    Sib
    Sib est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 30
    Points
    30
    Par défaut
    Pour le message concernant la variable "taille" non déclarée, l'erreur est toute bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       int taille = 150;
       char ligne[taille];
    Il faut déclarer "taille" avant de l'appeler pour la déclaration de "ligne"

  11. #31
    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 Sib
    Pour le message concernant la variable "taille" non déclarée, l'erreur est toute bête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       int taille = 150;
       char ligne[taille];
    Il faut déclarer "taille" avant de l'appeler pour la déclaration de "ligne"
    Attention, tu mets en oeuvre un concept nouveau du C99 (VLA) qui n'est pas forcément au point sur ton implémentation.

  12. #32
    Sib
    Sib est déconnecté
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 30
    Points
    30
    Par défaut
    Effectivement !

    Dans ce cas, il vaut mieux utiliser un malloc

  13. #33
    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 j'ai reccorigé et j'ai tjs un message d'erreur ( je vais jamais y arriver ) :

    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
     
     
    int lireligne(char ligne[], int taille);
    int main(void)
    {
       int l = 0;
       int c;
       int taille = 150;
      char ligne[taille];
     
       while ((c=getchar() !=EOF))
       {
         l =  lireligne(ligne, taille);
         ++l;
        printf("%d\n", l);
       }
    return 0;
    }
    warning : ISO C90 forbids variable -size array ligne

    PS : interdiction d'utiliser malloc pour moi ou tout autre chose que des tableaux , des boucles , et la fonction lireligne

  14. #34
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Utilises donc plutôt:

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

  15. #35
    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
    error taille undeclared...
    warning unused variable ligne...

    pour compiler j'utilise un makefile , qui compile avec ces options :

    gcc -W -Wall -ansi -pedantic

  16. #36
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Mon erreur, j'ai corrigé mon code...

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