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 sur petite fonction (conversion fahr / C°)


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 13
    Par défaut Problème sur petite fonction (conversion fahr / C°)
    Bonjour

    En soit j'ai déjà réussi mon petit exercice si je ne dit pas de betise (voici mon code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int.....conversion_F_C(int fahrenheit)
    {
     int...celsius;
     
     celsius = 0.5 * (fahrenheit - 32);
     return (celsius);
    }
    Mon probleme survient lorsque j'essai de rentrer les arguments avec "int ac, char **av".
    j'ai recodé ma fonction mais lorsque je l'execute, j'ai des segmentation fault ( généralement je comprend pourquoi du coup je peux les corriger) ou sinon j'ai bien mon opération qui se fait mais que sur un charactere et non sur la chaine de charactere.
    Je ne sais pas si je suis tres claire, mais je pense que cela sera plus claire apres avoir vue 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
     
     int.....conversion_F_c(char *f)
     {          
        int...f1;     
        int...celsius;
     
        celsius = 0;
        f1 = *f;                  
        celsius = 0.5 * (f1 - 32);
        return (celsius);
    }
     
     
    int    main(int ac, char **av)
    {
     printf("%d\n", conversion_F_c(av[1]);
     printf("%d\n", conversion_F_C(50));    //pour verifier le resultat
     return (0);
    }
    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 776
    Par défaut
    Si ton programme plante tu as un pointeur foireux

    Ton pointeur n'est pas utile, tout comme ta variable f1

    Si tu passes en paramètre un char, soit ta température sera comprise en -128 et 127 [ce qui est correct en température terrestre], soit tu dois retirer '\0' (<- *).


    Édit: Ils sont intentionnels tes points

    Édit 1: En réalité, le paramètre char* correspond à un pointeur sur une chaîne de caractères et non pas un pointeur sur un char.


    *: c'est débile de convertir une température entre 0 et 9

  3. #3
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 13
    Par défaut
    Salut

    Donc le probleme vient de mon pointeur sur f?
    Pourquoi mon pointeur sur f n'est pas utilie? Je comprend que ma variable f1 ne sert a rien mais pour le pointeur...
    soit tu doit retirer '\0'
    je ne comprend pas pourquoi.
    Puis si je veux retirer le '\0', je parcourt ma chaine de caractere et je décrémente de 1?

    oui les petits points sont intentionnel, ils apparaissent lorsque j'utilise les tabulations, c'est un truc que j'ai configuré dans mon .vimrc

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 776
    Par défaut
    Je n'avais pas scrollé pour voir le main:

    Citation Envoyé par CrH4A4cK Voir le message
    Donc le probleme vient de mon pointeur sur f?
    Et pourtant tu ne fais que le déréférencer pour prendre sa valeur. Donc si ton programme plante à cet endroit, c'est que ton pointeur pointe sur rien


    Citation Envoyé par CrH4A4cK Voir le message
    Je comprend que ma variable f1 ne sert a rien mais pour le pointeur...
    Voici ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define CONVERT_FAHRENHEIT_TO_CELSIUS(DEGREE) ((DEGREE - 32) / 2)

    Parce que tu reçois du main une chaîne de caractères
    Donc pas 50, mais "50"

    Et si je te disais de retirer le caractère '\0', c'est parce que je pensais que tu pouvais recevoir un caractère .
    Donc pas 0, 1, 2, 3, ... mais '0', '1', '2, '3',...


    As-tu vérifié le paramètre ac pour être sûr que av[1] existe?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Pour commencer, c'est tout le code censé convertir une chaîne de caractères en nombre qui manque.
    Utiliser la fonction strtol() pour cela.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 13
    Par défaut
    Salut

    As-tu vérifié le paramètre ac pour être sûr que av[1] existe?
    je l'avais fait mais j'ai effacé la ligne quand je vous ai envoyé le code ( j'ai laissé que l'essentiel selon moi).

    Pour commencer, c'est tout le code censé convertir une chaîne de caractères en nombre qui manque.
    Utiliser la fonction strtol() pour cela.
    Grâce a strtol() mon programme fonctionne presque "parfaitement".
    Il me reste un warning et une note que je n'arrive pas a eliminer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    conversion_F_C.c: In function ‘main’:
    conversion_F_C.c:68:31: warning: passing argument 1 of ‘conversion_F_to_C’ from incompatible pointer type [-Wincompatible-pointer-types]
       my_putnbr(conversion_F_to_C(&result));
                                   ^
    conversion_F_C.c:50:5: note: expected ‘char *’ but argument is of type ‘int *’
     int conversion_F_to_C(char *f)
         ^
    Si tu passes en paramètre un char, soit ta température sera comprise en -128 et 127
    Comment je pourrais faire pour que la température soit comprise entre un intervalle plus grand?
    j'ai essayé de changer le type du parametre en gardant la meme structure de code mais ca ne fonctionne pas.
    un petit indice?

    atoi() est similaire a strtol()?

    Merci !

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 776
    Par défaut
    Citation Envoyé par CrH4A4cK Voir le message
    Comment je pourrais faire pour que la température soit comprise entre un intervalle plus grand?
    Avec une chaîne de caractère ton nombre est infini par exemple "5841125147742584477145"

    Ton type int est un peu grand, mais il fait le job.


    Citation Envoyé par CrH4A4cK Voir le message
    atoi() est similaire a strtol()?
    atoi est plus ou moins dépréciée et elle retourne un int (le i de atoi) alors que strtol retourne un long (le l de strtol).

  8. #8
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 13
    Par défaut
    Hi,

    Avec une chaîne de caractère ton nombre est infini par exemple "5841125147742584477145"
    C'est ce que j'avais cru comprendre mais lorsque je fais ./a.out "128" ca me fait n'importe quoi (il me renvoi -80 au lieu de 48 environ) alors que ma fonction "test" me renvoi le bon resultat.

    Merci

  9. #9
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 13
    Par défaut
    Salut

    Voici mon code apres l'aide que vous m'avez apporté :
    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
     
    int.....conversion_F_to_C(char *f)
    {
        int...celsius;
     
        celsius = 0;
        celsius = 0.5 * (*f - 32);
        return (celsius);
    }
     
      int.....main(int ac, char **av)
      {
        int...result;
        char..*fin = NULL;
        result = 0;
     
        if (ac != 2)
          return (0);
        result = strtol(av[1], &fin, 10);
        my_putnbr(conversion_F_to_C(&result));
        my_putchar('\n');
        my_putnbr(conversion_F_C(128));
        my_putchar('\n');
        return (0);
    }
    Il me reste quelques petits problèmes :
    Comme je l'ai dit plus haut, si mon argument av[1] est supérieure a 127 le resultat est faux alors que normalement je suis sencé pouvoir mettre n'importe quel nombre, non?

    j'ai aussi ces deux erreures je ne comprend pas du tout comment les corriger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    conversion_F_C.c: In function ‘main’:
    conversion_F_C.c:68:31: warning: passing argument 1 of ‘conversion_F_to_C’ from incompatible pointer type [-Wincompatible-pointer-types]
       my_putnbr(conversion_F_to_C(&result));
                                   ^
    conversion_F_C.c:50:5: note: expected ‘char *’ but argument is of type ‘int *’
     int conversion_F_to_C(char *f)
    un indice?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Dès la première ligne, l'erreur est apparente.
    Ta fonction de conversion entre °C et °F doit travailler exclusivement avec des nombres, et non pas des chaînes de caractères.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    int conversion_F_to_C(int fahrenheit)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Novembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2015
    Messages : 13
    Par défaut
    Merci beaucoup!!
    j'étais persuadé que cela 'allait pas fonctionné si je changé le type.
    j'avais déjà essayé certaine modification mais cela avait foiré!

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

Discussions similaires

  1. problème sur la fonction CreateProcess(..)
    Par mog83 dans le forum Visual C++
    Réponses: 5
    Dernier message: 20/05/2008, 13h46
  2. [RegEx] problème sur la fonction preg_replace pour formatage
    Par medkyl dans le forum Langage
    Réponses: 4
    Dernier message: 06/02/2008, 17h37
  3. Réponses: 3
    Dernier message: 23/08/2007, 00h39
  4. [MySQL] exécuter un script php en commande linux : problème sur les fonctions mysql
    Par dr_octopus74 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/03/2007, 16h34
  5. problème sur substring (fonction inconnue)
    Par nerick dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/12/2005, 15h46

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