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 avec la fonction pow(les puissance)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 18
    Par défaut Problème avec la fonction pow(les puissance)
    Bonjour a tous

    j'ai un petit pb avec la fonction pow pour calculer les puissances.
    par exemple quand dans mon code je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int result = 0;
    result = pow(10, 2);
     
    printf("%ld", result);
    Sa marche
    mais quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%ld", pow(10, 2));
    Sa marche pas

    J'arrive pas a comprendre pk et sa fais plein d'erreur dans mon programme

    merci pour votre aide

  2. #2
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Prototype de pow :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           double pow(double x, double y);
    Dans ton premier code, il fait un cast vers le type entier donc si le résultat est entier, tout fonctionnera (bien que tu devrais mettre %d et non %ld...)


    Dans le deuxième code, aucun cast n'est fait et un compilateur correctement paramétré devrait te sortir un message de warning pour prêvenir que ce que tu donnes à printf et ce que tu lui dit sont deux choses distinctes...

    Jc

  3. #3
    Expert confirmé
    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
    Par défaut
    fearyourself
    Dans le deuxième code, aucun cast n'est fait et un compilateur correctement paramétré devrait te sortir un message de warning pour prêvenir que ce que tu donnes à printf et ce que tu lui dit sont deux choses distinctes...
    Je ne crois pas que les compilateurs vont jusqu'à analyser la chaîne de format pour vérifier leur concordance avec les paramètres qui sont donnés au printf. Le prototype de printf ne permet pas de telles vérifications.

  4. #4
    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
    GCC le fait, utilisant une extension appelee __printflike.
    La c*nnerie majeure de certaines versions (j'ignore si c'est toujours le cas), c'est qu'il accepte seulement un void* pour %p, plutôt que NimporteQuoi *...

    (enfin, ça a peut-être été résolu depuis)
    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.

  5. #5
    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 Médinoc
    GCC le fait, utilisant une extension appelee __printflike.
    La c*nnerie majeure de certaines versions (j'ignore si c'est toujours le cas), c'est qu'il accepte seulement un void* pour %p, plutôt que NimporteQuoi *...

    (enfin, ça a peut-être été résolu depuis)
    J'espère que non. C'est la norme. "%p" attend un void*. Point. Si ce n'est pas le cas, cast obligatoire.

    Sachant que certains développeurs de gcc sont des gens du comité de normalisation, je ne m'en fais pas trop sur la comformité du gcc à la norme...

  6. #6
    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
    Mais c'est débile!
    En C, ça augmente les risques de cast "sauvage" de n'importe quoi en void* !

    À quoi sert cette connerie?! Le type de destination n'est pas supposé agir sur la taille d'un pointeur!
    (à l'inverse des anciens modifieurs comme far et near)
    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.

  7. #7
    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 Médinoc
    Mais c'est débile!
    En C, ça augmente les risques de cast "sauvage" de n'importe quoi en void* !

    À quoi sert cette connerie?! Le type de destination n'est pas supposé agir sur la taille d'un pointeur!
    (à l'inverse des anciens modifieurs comme far et near)
    Ils sont peut être anciens, mais ils existent toujours (je rappelle que tout processeur x86 boot en mode reel 16-bit)

    Le type par défaut des variadics est int. Si la variable n'a pas le bon type (il y a un risque avec NULL par exemple, qui peut être un int), il faut caster. Le choix s'est porté sur void * parce que c'est le plus neutre, je suppose...
    Comportement indéfini.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("%p\n", (void*) NULL);
    Correct.

  8. #8
    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 diogene
    fearyourself Je ne crois pas que les compilateurs vont jusqu'à analyser la chaîne de format pour vérifier leur concordance avec les paramètres qui sont donnés au printf. Le prototype de printf ne permet pas de telles vérifications.
    Certains le font. Pourquoi ne le feraient-ils pas ? Sont pas plus bêtes que nous...

    Pour gcc, je recommande : -Wall -Wextra -O2

    Ta vie va changer !

  9. #9
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par diogene
    fearyourself Je ne crois pas que les compilateurs vont jusqu'à analyser la chaîne de format pour vérifier leur concordance avec les paramètres qui sont donnés au printf. Le prototype de printf ne permet pas de telles vérifications.
    Juste pour conclure ceci avec un exemple, utilisant :

    gcc version 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
    et le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        int i=3;
        double d=4.0;
        float f = 3.2;
        float *pf = &f;
     
        printf("%f %p %d %p\n",i,d,f,pf);
        return EXIT_SUCCESS;
    }
    Me donne ceci :

    ~/tmp$ gcc -Wall -Wextra -O2 testprintf.c
    testprintf.c: In function 'main':
    testprintf.c:11: warning: format '%f' expects type 'double', but argument 2 has type 'int'
    testprintf.c:11: warning: format '%p' expects type 'void *', but argument 3 has type 'double'
    testprintf.c:11: warning: format '%d' expects type 'int', but argument 4 has type 'double'
    Jc

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

Discussions similaires

  1. Problème avec la fonction pow
    Par marguerite99 dans le forum C
    Réponses: 13
    Dernier message: 14/11/2009, 14h25
  2. Réponses: 1
    Dernier message: 25/02/2009, 09h44
  3. [MySQL] Problème avec la fonction fgets et les retours chariot
    Par didoulive dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/02/2008, 19h08
  4. problème avec la fonction pow()
    Par emprex dans le forum C
    Réponses: 7
    Dernier message: 17/11/2007, 12h04
  5. probléme avec la fonction pow
    Par arglow dans le forum C
    Réponses: 7
    Dernier message: 23/07/2007, 13h38

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