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 :

Problème pour la création d'une fonction


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Problème pour la création d'une fonction
    Bonjour,
    Débutant en langage C, je dois pour un exercice, créer une fonction qui permet d'entrer des caractères du clavier dans un tableau t, y compris espaces et tabulations.L'entrée des caractères se termine par un retour-chariot. La fonction sera définie comme suit:
    lecture (t)
    char *t;
    {
    ... à écrire...
    }

    je vous lache mon 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
    19
    20
    21
     
    #include<stdio.h> 
    /* creation de la fonction */
    lecture(t)
    char *t;
    {
         for(t=0;t<'\0';t++);/* pour la lecture du tableau */
         gets(lecture(t));
    }
    /* programme de test */
    main ()
    {
    char t[100];
    lecture(t);
    printf("%s",t);
     
    sleep(30000);                     
    /* Le sleep est present pour garder la fenetre suffisement longtemps a l'ecran
    pour la lecture du résultat environs 30 secondes.*/
    return 0;
    }
    Le compilateur (Dev-C++ 4.9.9.2) me signale le warning suivant:
    [Warning] passing arg 1 of `gets' makes pointer from integer without a cast

    De plus le prog ne tourne pas, j'ai une superbe fenêtre d'erreur application avec le message suivant:
    L'exception unknown software exeption (0xc00000fd) s'est produite dans l'application à l'emplacement 0x004012a3.
    Cliquer sur ok pour terminer la programme.

    Où se trouve mon erreur, sachant que je ne peux pas contacter le prof (cours par correspondance), parce qu'il n'y a pas de permanence professeurale le week-end.

    Merci d'avance pour votre aide a tous.

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    A mon avis, c'est loin d'être le seul warning que tu auras si tu mettais de bonne option de compilation.


    Celui que tu as vient du fait que dans lecture, t est de type char*

    Et tu fais :

    0 est clairement pas de ce type. Donc warning. Je te signales que t est une variable locale, donc après le retour de la fonction, les modifications ne seront pas gardées.

    De plus,

    t<'\0'
    Ne veut pas dire grand chose non plus. Même *t<'0' n'est à mon avis pas que c'est ce que tu souhaites.

    Tu fais aussi : get(lecture()) et lecture ne retourne rien.

    Moi, quand je compiles (gcc -Wall -W -Wmain), j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    classique.c:4: warning: return type defaults to 'int'
    classique.c: In function 'lecture':
    classique.c:6: warning: ordered comparison of pointer with integer zero
    classique.c:7: warning: passing argument 1 of 'gets' makes pointer from integer without a cast
    classique.c:8: warning: control reaches end of non-void function
    classique.c: At top level:
    classique.c:11: warning: return type defaults to 'int'
    classique.c: In function 'main':
    classique.c:16: warning: implicit declaration of function 'sleep'
    /home/neoflo/tmp/cc2dS6ZY.o: In function `lecture':
    classique.c:(.text+0x1c): warning: the `gets' function is dangerous and should not be used.
    Bon, je suis de bonne humeur, je vais t'expliquer chaque warning :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: return type defaults to 'int'
    tu n'as pas spécifié le type de retour de ta fonction. Il est indiqué que par défaut, ta fonction retournera un int.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classique.c:6: warning: ordered comparison of pointer with integer zero
    C'est ce que j'avais dit, tu compares un pointeur et un entier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classique.c:7: warning: passing argument 1 of 'gets' makes pointer from integer without a cas
    Comme gets prend en entrée un char* et que lecture retourne un int. Il y a une erreur de typage dans les paramètres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classique.c:8: warning: control reaches end of non-void function
    Comme le type a été défini comme int, il faut retourner un int.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classique.c:11: warning: return type defaults to 'int'
    La fonction main a deux types possibles :

    int main(void) ou int main(int argc, char* argv[]).

    Tu n'as pas indiqué et il le mettra en int par défaut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classique.c:16: warning: implicit declaration of function 'sleep'
    Tu as oublié de définir le fichier d'entête qui déclare sleep. Au passage, sleep prend des secondes en entrées, et pas des millisecondes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: the `gets' function is dangerous and should not be used.
    Ca dit ce que ca dit, il est fortement déconseillé d'utiliser gets. Pourquoi ? Voir ici : http://c.developpez.com/faq/c/?page=...EEN_gets_fgets




    ---
    C'est étrange que tu utilises l'ancienne notation pour la définition des fonctions Pour bien définir les prototypes des fonctions, regarde ici : http://emmanuel-delahaye.developpez....c.htm#fonction ou http://c.developpez.com/faq/c/?page=..._prototype_def. Tu peux regarder tout le site, il est de très bonne qualité et il t'aidera bien, je l'espère.
    Je ne répondrai à aucune question technique en privé

  3. #3
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par jipé95
    Bonjour,
    Débutant en langage C, je dois pour un exercice, créer une fonction qui permet d'entrer des caractères du clavier dans un tableau t, y compris espaces et tabulations.L'entrée des caractères se termine par un retour-chariot. La fonction sera définie comme suit:
    lecture (t)
    char *t;
    {
    ... à écrire...
    }
    Aïe, ça commence mal, c'est de l'écriture K&R du temps des dinosaures. Si c'est dans le cadre d'un cours ou d'une formation, le formateur n'est pas à jour. De plus, pour la tâche proposée, passer la taille du tableau hôte des données est plus qu'indiqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int lecture (char * t /*, int taille_t*/)
    {
       /* ... à écrire... */
    }

    Citation Envoyé par jipé95

    je vous lache mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include<stdio.h> 
    /* creation de la fonction */
    lecture(t)
    char *t;
    {
         for(t=0;t<'\0';t++);/* pour la lecture du tableau */
         gets(lecture(t));
    }
    Oublie la fonction gets(), complètement. Interdis-toi de l'utiliser, cette fonction n'a aucun moyen d'offrir un contrôle par rapport à ce que saisit l'utilisateur, ainsi tu peux exploser un tampon de données (tableau par exemple) en fournissant plus de données qu'il ne peut en prendre. Utilise fgets() à la place pour une lecture par ligne (terminée par un retour-chariot, donc toute indiquée pour ta problématique). Tu peux ici utiliser aussi getchar() et fgetc()/getc() si tu veux stocker tes caractères 1 par 1. Sinon, tu fais un appel récursif de la fonction lecture() (qui ne va pas loin heureusement) sans t'en rendre compte et tu passes le retour de lecture (int) à gets() qui attend un char *, c'est je dois dire n'importe quoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int lecture(char * s, int nbElem)
    {
       fgets(s, nbElem, stdin); 
    }
    [/QUOTE]

    Citation Envoyé par jipé95

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* programme de test */
    main ()
    {
    char t[100];
    lecture(t);
    printf("%s",t);
     
    sleep(30000);                     
    /* Le sleep est present pour garder la fenetre suffisement longtemps a l'ecran
    pour la lecture du résultat environs 30 secondes.*/
    return 0;
    }
    Le compilateur (Dev-C++ 4.9.9.2) me signale le warning suivant:
    [Warning] passing arg 1 of `gets' makes pointer from integer without a cast

    De plus le prog ne tourne pas, j'ai une superbe fenêtre d'erreur application avec le message suivant:
    L'exception unknown software exeption (0xc00000fd) s'est produite dans l'application à l'emplacement 0x004012a3.
    Cliquer sur ok pour terminer la programme.

    Où se trouve mon erreur, sachant que je ne peux pas contacter le prof (cours par correspondance), parce qu'il n'y a pas de permanence professeurale le week-end.

    Merci d'avance pour votre aide a tous.
    Néanmoins, si tu souhaites une solution sans à avoir à ajouter la taille du tableau en paramètre, utilises par exemple un define. Exple:

    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
     
    #include <stdio.h>
    #define TMAX 100
     
    void lecture(char * s)
    {
       fgets(s, TMAX, stdin);
    }
     
    int main(void)
    {
      char t[TMAX];
      lecture(t);
      printf("%s",t);
      return 0;
    }
    Enfin, je te conseille d'acheter le fameux K&R pour apprendre le langage C. Même si il n'est pas forcément très péda, il m'a l'air plus au point que ton prof par correspondance.

    A+

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par jipé95
    De plus le prog ne tourne pas, j'ai une superbe fenêtre d'erreur application avec le message suivant:
    L'exception unknown software exeption (0xc00000fd) s'est produite dans l'application à l'emplacement 0x004012a3.
    Je pense que c'est du au fait que ton code n'a pas la structure " requise "
    pour un programme en C.

    Tu devrais avoir, par exemple :


    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
    #include...
    #include...
    #define...
     
    void PROCEDURE(int nombre)
    {
     
    (instructions...)
     
    }
     
     
    int FONCTION1()
    { (d'autres instructions...)
    }
     
    char *FoNcTion( int place )
    {
     
    int machin;
    double bidule;
     
    (encore des instructions...)
    }
     
    main()
    {
     
    (toujours des instructions...)
     
    }

    EN GROS, il te faut toujours au minimum :
    * #include <stdio.h> ( inclure une librairie qui contient des instructions
    ex : strlen, strcpy, printf....

    * main() ( module principal du programme)
    ne pas oublier les accolades

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut merci beaucoup
    Bonjour,
    Merci a tous pour vos commentaires...

    Je prend note et m'aperçois du même coup que je payes peut être pour rien....
    Enfin, je vais perdurer quand même
    Tchô

  6. #6
    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 Jean|Jean[FR]
    EN GROS, il te faut toujours au minimum :
    * #include <stdio.h> ( inclure une librairie qui contient des instructions
    ex : strlen, strcpy, printf....
    Ce n'est pas une bibliotheque (en francais library ne se traduit pas pas librairie mais par bibliotheque) mais un fichier d'entete. La bibliotheque contenant strlen, strcpy, printf, etc. est la bibliotheque standard du C.
    Les deux notions de ficher d'entete et de bibliotheque sont differentes:
    * un fichier d'entete contient des constantes, declaration de fonctions, etc. et est utilise lors de la phase de compilation d'un programme.
    * une bibliotheque contient le code compile des fonctions et est utilise lors de l'edition de lien.

    Citation Envoyé par Jean|Jean[FR]
    * main()
    int main(void)

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

Discussions similaires

  1. Aide pour la création d'une fonction - moyenne mobile exponentielle
    Par antoineDG dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2012, 17h13
  2. [XL-2010] Problème pour la création d'une carte sous Excel
    Par SkyCorp dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/10/2011, 23h52
  3. Réponses: 0
    Dernier message: 29/07/2009, 11h13
  4. Réponses: 2
    Dernier message: 25/06/2007, 11h38
  5. Réponses: 6
    Dernier message: 06/03/2007, 00h06

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