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 :

écrire une macro "le module"


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 171
    Par défaut écrire une macro "le module"
    Bonjour,
    Voilà mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include struct Complexe Complexe;
    struct Complexe {
    double a; /* Partie reelle */
    double b; /* Partie imaginaire */
    };
    Comment faire pour écrire une macro MOD(z) pour calculer le module du nombre complexe z ?
    Sachant que le module du nombre complexe z = (a, b) est donnée par :
    |z| = racine(a² + b²).
    Alors si quelqu'un peut m'aider.
    Merci.


  2. #2
    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 momeftah
    Bonjour,
    Voilà mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include struct Complexe Complexe;
    Cette ligne n'a aucun sens. Tu veux dire typedef ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct Complexe Complexe;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct Complexe {
    double a; /* Partie reelle */
    double b; /* Partie imaginaire */
    };
    Comment faire pour écrire une macro MOD(z) pour calculer le module du nombre complexe z ?
    Pourquoi une macro ?
    Les macros çaÿ mal.
    Commence par ecrire une fonction.
    Sachant que le module du nombre complexe z = (a, b) est donnée par :
    |z| = racine(a² + b²).
    si 'racine' est 'racine carrée', sqrt() devrait faire l'affaire. Le reste devait être simple...

    Fait de ton mieux et poste le code si il ne fonctionne pas.

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    La fonction "hypot" de "math.h" calcule la racine de la somme des carrés:
    http://man.developpez.com/man3/hypot.3.php

    Sinon en C99 il existe un type "complex" avec des fonctions définies:
    http://man.developpez.com/man5/complex.5.php
    et en particulier pour ce calcul:
    http://man.developpez.com/man3/cabs.3.php

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Les macros çaÿ mal.
    Pour ce type de calcul l'économie d'un appel de fonction n'est pas négligeable.
    Donc une macro pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MOD(z) (sqrt(z.a*z.a+z.b*z.b))

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Citation Envoyé par momeftah
    Bonjour,
    Voilà mon problème :
    #include struct Complexe Complexe;
    struct Complexe {
    double a; /* Partie reelle */
    double b; /* Partie imaginaire */
    };

    Comment faire pour écrire une macro MOD(z) pour calculer le module du nombre complexe z ?
    Sachant que le module du nombre complexe z = (a, b) est donnée par :
    |z| = racine(a² + b²).
    Alors si quelqu'un peut m'aider.
    Merci.
    Pourquoi ne pas utiliser le type complex défini en C99 : Les nombres complexes, la fonction pour calculer le module est fournie avec : cabs

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par seriousme
    Pour ce type de calcul l'économie d'un appel de fonction n'est pas négligeable.
    Donc une macro pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MOD(z) (sqrt(z.a*z.a+z.b*z.b))
    Je vois au moins deux problèmes avec cette macro. Comme dit Emmanuel:
    Les macros çaÿ mal.

  7. #7
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Lesquels?
    Le "z.a" et le manque de parenthésage?
    Ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MOD(z) (sqrt((z).a*(z).a+(z).b*(z).b))
    semble mieux.
    Sinon quelles modifications ajouter?

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par seriousme
    Lesquels?
    Le "z.a" et le manque de parenthésage?
    Ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MOD(z) (sqrt((z).a*(z).a+(z).b*(z).b))
    semble mieux.
    Sinon quelles modifications ajouter?
    C'est mieux en effet. Le deuxième problème, c'est l'utilisation multiple des paramètres. Si quelqu'un décide de faire MOD(*x++), le résultat risque de ne pas être celui attendu. Je ne connais pas de méthode portable et sans inconvénient pour résoudre ce problème.

  9. #9
    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 seriousme
    Pour ce type de calcul l'économie d'un appel de fonction n'est pas négligeable.
    Donc une macro pourrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MOD(z) (sqrt(z.a*z.a+z.b*z.b))
    Double évaluation des paramètres, manque de parenthèses... C'est risqué...

    Les macros sont un instrument très tranchant.

  10. #10
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Si quelqu'un décide de faire MOD(*x++)
    Oui mais ceci est un problème intrinsèque aux macros.
    Sinon c'est sûr que le mieux serait une fonction inline.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Là où les fonctions inline sont disponibles, les macros ne sont généralement utiles que pour les opérations spécifiques aux macros: "Stringification" (opérateur #) et "Token-pasting" (opérateur ##), génération de cases pour un switch()/d'entrées pour un tableau (ItemLists)...

    Bref, n'utiliser une macro que pour ce qu'une fonction inline ne peut pas faire.
    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.

  12. #12
    Membre confirmé
    Inscrit en
    Août 2006
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 171
    Par défaut
    Citation Envoyé par momeftah
    Bonjour,
    Voilà mon problème :
    typedef struct Complexe Complexe;
    struct Complexe {
    double a; /* Partie reelle */
    double b; /* Partie imaginaire */
    };

    Comment faire pour écrire une macro MOD(z) pour calculer le module du nombre complexe z ?
    Sachant que le module du nombre complexe z = (a, b) est donnée par :
    |z| = racine(a² + b²).
    Alors si quelqu'un peut m'aider.
    Je vais améliorer mon code et je vous tiens au courant ok.

    Merci.

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par gege2061
    Bonjour,


    Pourquoi ne pas utiliser le type complex défini en C99 : Les nombres complexes, la fonction pour calculer le module est fournie avec : cabs

    Et on a donné une belle suite d'arguments en défaveur des macros...
    Sache que pas mal de compilos C, C99-compliants ou non, ont une extension pour faire des fonctions inline... (il me semble que le standard C99 exige de les supporter, mais je n'en suis pas sûr).
    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.

  14. #14
    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
    <...> fonctions inline... (il me semble que le standard C99 exige de les supporter, mais je n'en suis pas sûr).
    Oui.
    Par contre, l'état des complexes avec gcc 4.x (C99) est 'broken', si je me souviens bien...

  15. #15
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Médinoc
    Et on a donné une belle suite d'arguments en défaveur des macros...
    Je ne parle pas de macro Je crois qu'on a du mal à se comprendre en ce momment

    Citation Envoyé par Médinoc
    Sache que pas mal de compilos C, C99-compliants ou non, ont une extension pour faire des fonctions inline... (il me semble que le standard C99 exige de les supporter, mais je n'en suis pas sûr).
    Le C99 parle du mot clés inline mais ce n'est qu'une suggestion pour le compilateur (comme pour register), donc je pense que ceci est accepté (trop tôt pour que j'aille vérifier ) :
    Citation Envoyé par Emmanuel Delahaye
    Par contre, l'état des complexes avec gcc 4.x (C99) est 'broken', si je me souviens bien...
    Effectivement, les opérations de base étant assez simple je pense qu'elles fonctionnent (pour les 2/3 tests que j'ai fait c'était le cas) mais je n'ai pas testé la projection sur la sphère de Riemann

Discussions similaires

  1. [OpenOffice][Tableur] Comment écrire une macro avec 2 variables et enregistrement des résultats du calcul
    Par Pascaltech dans le forum OpenOffice & LibreOffice
    Réponses: 9
    Dernier message: 09/09/2015, 18h00
  2. [XL-2010] Impossible de lancer une macro depuis un module
    Par lemisentrope dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/04/2014, 10h01
  3. [XL-2003] Peut on m'écrire une Macro - XL2003-2007
    Par ll30ll30 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/01/2013, 08h42
  4. Où écrire une macro
    Par kong985 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/10/2008, 15h02

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