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

Développement 2D, 3D et Jeux Discussion :

Question(s) sur l’utilisation de macros en C++.


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut Question(s) sur l’utilisation de macros en C++.
    Bonjour à tous.

    Pour ceux qui ne le savent pas encore, je développe un petit mario like à l'aide de la bibliothèque SDL2 et du tutoriel sur le TileMapping :
    http://jeux.developpez.com/tutoriels...tion-generale/.

    J'en suis à la partie sur les collisions et je ne saisis pas bien l'utilité des macros dans le fichier fsprite.c :
    http://jeux.developpez.com/tutoriels...sonnage/#LVI-B.

    Mon code à moi est celui ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SGN(X) (((X)==0)?(0):(((X)<0)?(-1):(1))) 
    #define ABS(X) ((((X)<0)?(-(X)):(X)))
    .

    Et cette fonction appelle ces 2 macros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void Affine(SDL_Rect &perso, SDL_Rect* mur, int &vx, int &vy)
    {
    	int i;
    	for (i = 0; i<ABS(vx); i++)
    	{
    		if (EssaiDeplacement(perso, mur, SGN(vx), 0) == 0)
    			break;
    	}
    	for (i = 0; i<ABS(vy); i++)
    	{
    		if (EssaiDeplacement(perso, mur, 0, SGN(vy)) == 0)
    			break;
    	}
    }
    .

    Je voudrais juste savoir pourquoi utiliser une macro plus tôt qu'une fonction ?
    Quelle est l'utilité ou les avantages à utiliser cette méthode plus tôt que celle des fonctions ?

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 394
    Points : 20 497
    Points
    20 497
    Par défaut
    salut l'intérêt il est tout bête c'est que ça prend moins de lignes de code plutôt que d'écrire un bloc avec des accolades.
    Sinon en C++ on peut utiliser des fonctions inline ( voir les tutos du C++) à condition que les lignes de codes soient en nombre réduit, le compilateur fait des optimisations lorsqu'il rencontre cette instruction
    En C++ en principe on évite les #define du C parce qu'on ne peut spécifier de type ; il vaut mieux utiliser const et inline
    Parce que si tu déclare #define ABS(X) X peut être n'importe quoi n'importe quel type de variable.

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    ok Merci de cette réponse.
    Du coups mon code doit etre changé en un code comme ceci si je comprends bien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    inline
    int SGN(int X)
    {
    	return X == 0 ? 0 : X < 0 ? -1 : 1;
    }
     
    inline
    int ABS(int X)
    {
    	return X < 0 ? -X : X;
    }

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 394
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 394
    Points : 20 497
    Points
    20 497
    Par défaut
    salut non pas besoin les #define suffisent.
    Si ça fonctionne eh bien pas besoin de changer surtout que ça prend moins de place.
    C'est juste dans une logique didactique

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Février 2015
    Messages : 169
    Points : 60
    Points
    60
    Par défaut
    Ok. Merci bien .

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Jeano81 Voir le message
    Je voudrais juste savoir pourquoi utiliser une macro plus tôt qu'une fonction ?
    Quelle est l'utilité ou les avantages à utiliser cette méthode plus tôt que celle des fonctions ?
    En C++ ya deux cas ou les macros sont préférables / obligatoires :
    - un truc impossible avec des fonctions (des copier / coller pour générer du code par exemple ou concaténer du texte)
    - un truc trop chiant à faire avec des fonctions / templates

    Les macros n'ont par contre aucun avantage particulier (dans ton cas tu peux utiliser std::abs et std::sign).

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Perso je n'ai rien contre les macros, tant au'on fait pas de trucs trop fous avec.
    Par contre dans ton code, y'a un truc qui est mal : ta condition de boucle.
    Tu refais a chaque iteration ABS et SGN. Est-ce totalement voulu ? Je vois des parametres par references ce qui est assez etonnant.
    C'est surement peu violent a ton echelle, mais autant prendre les bons reflexes.

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

Discussions similaires

  1. [XL-2010] Questions diverses sur macros
    Par Azulnoth dans le forum Macros et VBA Excel
    Réponses: 34
    Dernier message: 31/07/2014, 14h51
  2. question sur TableDestination dans macro TCD
    Par sash6 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/06/2007, 15h31
  3. [LDAP] Questions générales sur LDAP
    Par guiguisi dans le forum Autres SGBD
    Réponses: 5
    Dernier message: 25/05/2005, 10h05
  4. DTS : Question simple sur sources de données
    Par guignol dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/05/2004, 12h09
  5. Question simple sur les threads :)
    Par momox dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/06/2003, 04h13

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