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 :

probleme avec les macros


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 89
    Points : 11
    Points
    11
    Par défaut probleme avec les macros
    bonjour je suis en train de reviser les macos

    j ai tombé sur un exo qui me demande d écrire deux macro MAX ET MIN qui étant donné un type "entier" donne respectivement la plus grande et la plus petite valeur dy type . par exemple MAX(char) vaut 127 et MIN(unsigned char) vaut 0

    merci pour votre aide

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    En gros tu veux qu'on te donne la correction de l'exercice?
    Si c'est un exercice, la solution devrait se trouver dans ton cours non?

  3. #3
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    J'ai de gros doute qu'ils trouve une solution où que ce soit... Il n'existe à ma connaissance aucun moyen de distinguer un entier signé d'un entier non signé ...

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    c'est le préprocesseur qui interprète le code donc à ce niveau là, ce devrait être possible logiquement.

    typeof renvois le type de la variable il me semble donc on devrait avoir la distinction signé, non signé.
    -> Simple recherche sur google quand même.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par valefor Voir le message
    J'ai de gros doute qu'ils trouve une solution où que ce soit... Il n'existe à ma connaissance aucun moyen de distinguer un entier signé d'un entier non signé ...
    Bien sûr que si. Il suffit de vérifier si « (type)0 » est supérieur à « (type)-1 ». Si ce n'est pas le cas, c'est que « -1 » a été transtypé en type non signé. Et de là, ce « -1 » converti est égal à « ~0 » et est forcément la valeur la plus haute. Dans l'autre cas, il suffit de décaler cette valeur d'un bit vers la droite (en introduisant un bit à zéro à gauche, donc).

  6. #6
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    « (type)0 » est supérieur à « (type)-1 »
    Ben je me coucherai moins bête

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Neckara Voir le message
    c'est le préprocesseur qui interprète le code donc à ce niveau là, ce devrait être possible logiquement.

    typeof renvois le type de la variable il me semble donc on devrait avoir la distinction signé, non signé.
    -> Simple recherche sur google quand même.
    typeof est du C++, pas du C
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Citation Envoyé par diogene Voir le message
    typeof est du C++, pas du C
    A jongler entre forums c et c++... pardonnez moi

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Je ne pense pas que cela soit possible au moins sous cette forme.

    Par contre, les valeurs maximum et minimum des entiers sont listés dans <limits.h> sous la forme t_MAX et t_MIN, avec pour le radical t :

    - SCHAR, CHAR, SHRT, INT, LONG, LLONG complété par _MAX ou _MIN pour les types signed char, char, short, int, long, long long

    - UCHAR, USHRT, UINT, ULONG, ULLONG complété par _MAX pour les types unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long (il n'y a pas de _MIN pour les types entiers non signés, la valeur est toujours 0)

    On peut créer les macro sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define UCHAR_MIN 0
    #define USHRT_MIN 0
    #define UINT_MIN  0
    // etc ....
    #define VALMAX(type) type##_MAX
    #define VALMIN(type) type##_MIN
    avec pour type CHAR, SCHAR, UCHAR, SHRT, USHRT,.... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = VALMAX(UCHAR);
    int j = VALMIN(UCHAR);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Sinon, on a vu comment déterminer si la variable est en unsigned ou en signed, il ne nous reste plus qu'à savoir sur combien d'octet elle est codée.

    Si 16^4 = 0 alors le nombre est codé sur moins de 4 octet (puisque le compilateur va tronquer)

    on fait 16^i en faisant varier i.

  11. #11
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Sinon, on a vu comment déterminer si la variable est en unsigned ou en signed, il ne nous reste plus qu'à savoir sur combien d'octet elle est codée.

    Si 16^4 = 0 alors le nombre est codé sur moins de 4 octet (puisque le compilateur va tronquer)

    on fait 16^i en faisant varier i.
    Là, tu te lances vers une solution orientée fonction (détermination à l'exécution) pas macro.
    Il reste aussi à déterminer comment passer le paramètre
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  12. #12
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut
    salut !

    Obsidian a donné toute la réponse, laissons donc symplyc faire son exo ...

    A+
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    En reprenant la réponse d'Obsidiant

    On ne peut pas faire un truc du genre :
    MAX(x) ((x)==(x + 16^1)?(...)...)) ?

    EDIT : @anacharsis : désolé, j'étais en train d'écrire quand tu as posté.

  14. #14
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @ Neckara
    pas de problème Neckara.
    de toute façon, mon avis n'engage que moi ...

    mais on n'a pas besoin des puissances de 2, >> suffit bien.
    je veux bien donner une indication à simplyc (excuse moi d'avoir écorché ton pseudo dans mon dernier message) :

    MAX(type) a un comportement de fonction dont le résultat dépend d'une seule condition ; il n'y a pas beaucoup de façons de faire ça dans une macro simple.

    A+
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Citation Envoyé par anacharsis Voir le message
    mais on n'a pas besoin des puissances de 2, >> suffit bien.
    Sur un MCS 251, pour multiplier/diviser en base deux, il vaut mieux faire des décalage plutôt que des divisions/multiplications

    MAIS sur un ordinateur, c'est l'inverse.
    Cela prend moins de temps de faire une multiplication/division que des décalages.

  16. #16
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @ Neckara
    ça ne prend pas de temps : MAX(unsigned long long) est une constante littérale 0xFFFFFFFFFFFFFFFF! et si tu as déjà regardé le code source du pré-compilateur tu ne pensera plus au temps qu'il faut pour calculer les constantes. écris donc la macro avec des multiplications et avec un shift, compare la longueur des codes générés...

    A+
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

  17. #17
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par Neckara Voir le message
    MAIS sur un ordinateur, c'est l'inverse.
    Cela prend moins de temps de faire une multiplication/division que des décalages.
    Je ne crois pas me tromper en affirmant que multiplier ou diviser par deux des entiers est équivalent à faire des décalages. Je veux dire que le compilo prend l'initiative de faire ce qu'il pense être le plus performant.

  18. #18
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par valefor Voir le message
    Je ne crois pas me tromper en affirmant que multiplier ou diviser par deux des entiers est équivalent à faire des décalages. Je veux dire que le compilo prend l'initiative de faire ce qu'il pense être le plus performant.
    Non seulement c'est vrai de nos jours, mais dans le cas qui nous occupe aujourd'hui, il s'agit d'une macro. Sa valeur sera donc résolue par le compilateur avant même l'exécution du programme.

  19. #19
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    @ anacharsis et Neckara
    Je ne vois vraiment pas où vous essayez d'amener simplyc, en tout cas pas vers une solution qui correspond au problème qu'il a posé.
    Vous essayez d'écrire une fonction pour faire le travail, mais pour que cette fonction se transforme en une macro répondant à la question, il faut qu'elle puisse ne comporter comme code qu'un return expression auquel cas la macro se résumera à expression. Sinon, vous n'arriverez pas avec votre macro à écrire quelque chose d'aussi basique que int i = MAX(....)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  20. #20
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Points : 380
    Points
    380
    Par défaut @diogène
    salut !
    çà donnera à simplyc une indication supplémentaire : une macro simple ne peut rendre un résultat que si elle se développe en une expression.
    en C, il n'existe qu'une expression conditionnelle c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (condition ? oui : non)
    il ne reste plus qu'à écrire condition, oui, non, comme le dit Obsidian.

    A+
    Don't want money. Got money. Want admiration.
    (A tribute to SSG)

Discussions similaires

  1. problemes avec les tableaux et macros
    Par Aniss00 dans le forum C
    Réponses: 4
    Dernier message: 15/10/2014, 20h53
  2. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 17h55
  3. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 14h26
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 23h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 01h18

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