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 :

#define ne fonctionne pas


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut #define ne fonctionne pas
    Bonjour à toutes et à tous,

    J'ai créé un macro qui retourne toute variable dans sa valeur absolue.

    La compilation se passe bien, mais la variable reste négative... je ne saisis pas l'erreur...

    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
    #include <stdio.h>
     
    #ifndef __MY_MACROABS__
     
    #define MY_MACROABS(a) (((a) < 0) ? -(a) : (a))
     
    int     main()
    {
        int a = -123;
     
        MY_MACROABS(a);
        printf("\nA : %d\n\n", a);
     
        return 0;
    }
     
    #endif
    Voilà le retour dans le terminal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    xxxxx_x@XxxxXxxx:~/rendu/test-my_macroABS$ ./a.out
     
    A : -123
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Zachiaggi Voir le message
    J'ai créé un macro qui retourne toute variable dans sa valeur absolue...je ne saisis pas l'erreur...
    Bonjour

    Peut-être serait-il utile de mémoriser ce que renvoie MY_MACROABS(). Tu le dis toi-même: ta macro retourne une valeur, elle ne modifie rien !!!

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef __MY_MACROABS__
     
    #define MY_MACROABS(a) (((a) < 0) ? -(a) : (a))
     
    int     main()
    {
        int a = -123;
     
        a=MY_MACROABS(a);
        printf("\nA : %lu\n\n", a);
        printf("\nAutre essai: %lu\n\n", MY_MACROABS(-512));
     
        return 0;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    étudiant
    Inscrit en
    Avril 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Salut je suis encore au stade débutant mais j'ai l'impression que tu " appeles (utilises)" ton define de la meme facon que tu " appelerais " une fonction. Pourquoi ne pas simplement faire une fonction et inclure son prototype au même endroit que ton define ? Si tu veux absolument le mettre en define peut-etre que tu pourrais utiliser la fonction "fabs" qui met automatiquement en valeur absolue.
    En espérant que ça puisse t'aider bonne journée.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par acheriti Voir le message
    Salut je suis encore au stade débutant mais j'ai l'impression que tu " appeles (utilises)" ton define de la meme facon que tu " appelerais " une fonction.
    Exact. C'est ce qu'on appelle une "macro avec paramètres". Et tu remarqueras que chaque paramètre est bien entouré de parenthèses pour protéger contre des erreurs de priorité éventuelles...

    Citation Envoyé par acheriti Voir le message
    Pourquoi ne pas simplement faire une fonction et inclure son prototype au même endroit que ton define ?
    C'est possible aussi. La différence c'est que la macro est inégralement recopiée par le préprocesseur lors de l'analyse des #include et des #define. Ca donne alors un code plus rapide. La fonction, elle, oblige alors à implémenter tout un mécanisme de mémorisation de l'environnement pour pouvoir ensuite créer un environnement de travail vierge pour que le code de la fonction puisse s'exécuter dans sa bulle de travail perso. Le programme est alors plus lent.
    Ici l'avantage est justement de pouvoir faire "comme avec une fonction" sans mettre en oeuvre tout son mécanisme d'appel...

    Citation Envoyé par acheriti Voir le message
    Si tu veux absolument le mettre en define peut-etre que tu pourrais utiliser la fonction "fabs" qui met automatiquement en valeur absolue.
    Il s'agit juste d'un exercice d'apprentissage et non d'un code fonctionnel...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,

    peut-être hors niveau ... mais il existe aussi les fonctions «inlinées» qui remplacent dans certains cas avantageusement les macros ; cf wikipedia par exemple.

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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