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 :

Utilisation de macro


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut Utilisation de macro
    Bonjour à tous !

    J'aurais une petite question à vous poser ! Je suis actuellement en stage et je dois réaliser un programme pour une entreprise. Ce programme fonctionne grâce à une carte qui ne se trouve pas sur mon lieu de stage.

    Il faut donc que je créée différentes macros pour remplacer les fonctions utiliséés pour la carte (Mon programme inclut les fichiers servo.h et servo.c) pour pouvoir faire les tests avant de me rendre sur place pour tester le programme.

    Je ne sais pas si c'est clair pour vous... Mais j'aimerais savoir si il existe des fonctions toutes faites (grâce à différentes fonctions du logiciel Dev C++ ou encore d'Allegro (je doit l'utiliser comme librairie externe)) ou s'il faut que je fasse mes macros moi même.

    Par exemple j'ai cette fonction qui permet d'écrire un mot (elle se trouve dans le fichier servo.c):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void _OutputW(WORD wPortAdress, WORD wOutputVal)
    {
    _outpw(wPortAddr, wOutputVal)
    }
    Je dois la remplacer par une macro mais je ne sais pas trop comment m'y prendre car je ne maitrise pas bien le C et encore moins les macros... Je sais juste que je dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define nom_de_ma_macro ()
    Merci d'avance pour votre aide, en espérant avoir été claire ! Bonne journée !

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    J'avais eu ce genre de problème a régler une fois et je l'avais résolu différemment.

    Le problème dans ton cas avec les macro, c'est que le code exécuté et surtout les appels de fonction ne sont pas le même en mode "avec carte" et en mode "sans carte".

    Ce que j'avais fait utilisait une variable d'environnement genre SANS_CARTE

    et mes fonction qui utilisaient le hard spécifique étaient toutes de ce genre (je reprends ton exemple avec outpw()) :
    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 _OutputW(WORD wPortAdress, WORD wOutputVal)
    {
       if(getenv("SANS_CARTE") != NULL)
       {
          /* pas de carte, on emule */
          ...
       }
       else
       {
          /* utilise la carte */
          _outpw(wPortAddr, wOutputVal)
       }
    }
    Ensuite, tu compiles ton binaire et c'est le même binaire que tu peux utiliser, le comportement est modifié suivant la définition de la variable d'environnement SANS_CARTE
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Merci pour ta réponse !

    J'ai bien compris comment tu avais implanter ton code. Les "variables d'environnement" étaient complétement inconnu pour moi et j'ai beau chercher sur le web, je ne comprend pas comment déclarer ces variables et où...

    De plus, je ne vois pas comment simuler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _outpw(wPortAddr, wOutputVal)
    ... Je me sens un peu pommée et nulle !

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Une variable d'environnement est une variable qui possède un nom et une valeur. Cette variable est positionnée par le système d'exploitation et interrogeable par le programme (justement par la fonction getenv).

    Pour voir les variables d'environnement de ton système, tu lances un shell et tu tapes la commande "set" sous Windows (sous Unix, la commande dépend de ton shell, cela peut être set ou sentenv)

    Pour positionner les variables d'environnement maintenant. Sous Windows, clic droit sur le poste de travail option propriétés, dans l'onglet avancé, il y a un bouton Variable d'environnement et tu fais tes modifications (il faut peut être rebooter pour que les modifications soient prises en compte). Sous Unix, il faut regarder dans tes scripts de lancement (~/.bashrc par exemple).

    Si les variable d'environnement ne te plaisent pas, tu peux baser ton test sur la présence ou non d'un fichier de debug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void _OutputW(WORD wPortAdress, WORD wOutputVal)
    {
       if(existfile("fichier_debug") == 0)
       {
          /* pas de carte, on emule */
          ...
       }
       else
       {
          /* utilise la carte */
          _outpw(wPortAddr, wOutputVal)
       }
    }
    Sinon pour revenir à ton problème, tu as 2 modes, 1 avec carte et 1 sans carte.

    sur cette carte, tu vas pouvoir envoyer des commandes :
    • restart_carte()
    • get_status()

    par exemple.

    dans ces fonctions, tu vas faire les vraies commandes ou bien les emuler (dans la limite du possible, il y a parfois des choses trop dures à émuler ou bien dont le coup de réalisation est trop élevé.

    En suivant l'exemple précédent :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void restart_carte(void)
    {
       if(getenv("SANS_CARTE") != NULL)
       {
          /* pas de carte, on emule */
          status_emule = restarted;
       }
       else
       {
          /* utilise la carte */
          _outpw(wPortAddr, wOutputVal)
       }
    }
     
    int get_status(void)
    {
       if(getenv("SANS_CARTE") != NULL)
       {
          /* pas de carte, on emule */
          return status_emule;
       }
       else
       {
          /* utilise la carte */
          return _inpw(wPortAddr)
       }
    }
    la variable status_emule est une variable globale définie dans un module à part dédié à l'emulation de ta carte.

    Après, tout dépend de ce que tu veux émuler exactement et des fonctions que tu veux émuler (fonctionnement en mode basique, fonctionnement qui ne marche pas), c'est à toi de voir et aussi de la finesse que tu veux apporter à ton émulation.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    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 ram-0000 Voir le message
    Pour voir les variables d'environnement de ton système, tu lances un shell et tu tapes la commande "set" sous Windows (sous Unix, la commande dépend de ton shell, cela peut être set ou sentenv)
    env fonctionne quelque soit le shell.

    Pour positionner les variables d'environnement maintenant. Sous Windows, clic droit sur le poste de travail option propriétés, dans l'onglet avancé, il y a un bouton Variable d'environnement et tu fais tes modifications (il faut peut être rebooter pour que les modifications soient prises en compte).


    Sous Unix, il faut regarder dans tes scripts de lancement (~/.bashrc par exemple).
    Ca, c'est pour avoir une variable mise en permanence. Normalement, on utilise
    setenv/ = + export suivant le shell dans le shell ou on lance le programme. Et les debuggeurs permettent de placer les variables a ce qu'on veut. Les EDI devraient etre capables de faire la meme chose.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Les EDI devraient etre capables de faire la meme chose.
    Je viens de ragarder, effectivement Visual Studio sait le faire, tu me l'apprends et je me coucherai moins bête ce soir.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Bonjour à vous ! Du coup mon maître de stage veut absolument que je me serve de macros... Voilà ce qu'il veut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #define MODE_SANS_CARTE 0
    //#define MODE_SANS_CARTE 1
    //une des 2 lignes en commentaire et l'autre active
     
    if (MODE_SANS_CARTE == 0) {
              //faire ceci
    } 
    else 
    {
            //faire cela
    }
    Il m'a préciser qu'il fallait, si le MODE_SANS_CARTE==0, que ca aille chercher dans un fichier texte les informations pour simuler la carte...
    Désolé pour le non précision, mais j'ai pas tout compris...

    J'ai trouvé des Opérations d’entrée et de sortie où il y a un tableau avec différentes opération comme :
    - fgetc : lit un caractère
    - getc : version macro de fgetc
    - fputc : écrit un caractère
    - putc : version macro de fputc

    Mais je ne sais pas comment m'en servir, est ce que c'est ce genre d'opération dont je dois me servir ?!?
    Et aussi faut il ouvrir justement ce fichier texte avant de lire ou cela se fait automatiquement ?

  8. #8
    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
    Tu commences par ouvrir le fichier texte avec fopen(), puis tu peux le lire (si fopen() n'a pas échoué pour une raison ou une autre).

    Pour le fichier texte, le mieux est que les lignes aient une longueur maximale connue. Ainsi, tu peux alors utiliser fgets() pour lire le fichier ligne par ligne, et le reste se fait en mémoire (analyse de la chaîne, conversion etc. La fonction sscanf() peut être utile pour ça).
    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.

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Merci pour ta réponse. J'ai résolu mon problème je met le bout de code qui pourrait être intéressant si quelqu'un d'autre rencontre ce genre de problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #define MODE_SANS_CARTE 0
    //#define MODE_SANS_CARTE 1
    //une des 2 lignes en commentaire et l'autre active
     
    #if MODE_SANS_CARTE == 0
              file=fopen("fichier.txt","w");
              if (file != NULL)
    {
             fprintf(file,"écriture sur servo : port : %u valeur %u", wPortAddr, wOutputVal);
    }
    #else
             // _outpw(vPortAddr,wOutputVal);
    }
    Une autre question avant de cliquer sur RESOLU : J'aimerai mettre l'ouverture et la fermeture du fichier directement dans le main() pour éviter de répéter ce code pour chaque fonction qui ressemble au code précédent (lire mot, ecrire mot, lire caractère, ecrire caractère).
    J'ai beau essayer plein de chose je n'y arrive pas... Une idée ?!?

    NB : En tout cas, merci à vous pour vos réponses qui m'ont beaucoup aidé !

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //commenter la ligne suivante pour activer la carte
    #define MODE_SANS_CARTE
     
    #ifdef MODE_SANS_CARTE
       file=fopen("fichier.txt","w");
       if (file != NULL)
       {
          fprintf(file,"écriture sur servo : port : %u valeur %u", wPortAddr, wOutputVal);
          fclose(file);
       }
    #else
       _outpw(vPortAddr,wOutputVal);
    #endif
    }

    Par contre, ce qui me gêne :
    • le fichier est ouvert et pas refermé (je le ferme dans mon exemple ci dessus).
    • Le fichier est ouvert en mode "w" et pas en mode "a". Donc à chaque ouverture, tu écrases le fichier (mais c'est peut être ce que tu veux)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Oui désolé il était mis dans mon code j'ai oublié de le mettre ici ! Pour le "w" oui c'est vrai que c'est bien plus logique de mettre le "a"
    Merci pour l'optimisation !

    Pas de solution pour l'ouverture et la fermeture du fichier directement mis dans le main() ?

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Au fait, il manque un \n à la fin de ton fprintf

    Citation Envoyé par Skangell Voir le message
    Pas de solution pour l'ouverture et la fermeture du fichier directement mis dans le main() ?
    Ben, c'est bien comme cela évite les variables globales. Après, cela dépend du nombre de fois que tu vas appeler la fonction.

    C'est sûr que si tu m'appelle 1 000 000 de fois, il faudra peut être optimiser et mettre l'ouverture et la fermeture dans le main et utiliser une variable globale.

    L'avantage de l'ouvrir et le fermer localement comme maintenant, c'est que tu peux regarder ton fichier même si ton programme est en marche, le fichier n'est pas locké.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  13. #13
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 149
    Par défaut
    Justement, je vais devoir l'apeller plusieurs fois donc c'est pour ça que je l'ai mis dans le main()

    C'est bon j'ai résolu le problème, plus de message d'erreur tout à l'air de fonctionner

    Merci de votre aide et surement à bientôt pour de nouveaux problèmes ^^

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

Discussions similaires

  1. Utiliser des macros Excel sous open office
    Par Memes dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 08/11/2007, 21h46
  2. comment faire pour que plusieurs user utilise mem macro?
    Par megapacman dans le forum Access
    Réponses: 4
    Dernier message: 27/03/2006, 16h55
  3. [VBA] utiliser une macro contenue dans un autre classeur
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 01/02/2006, 18h46
  4. Comment utiliser la macro TRACE()?
    Par Crisanar dans le forum MFC
    Réponses: 6
    Dernier message: 16/09/2005, 10h48
  5. Macro utilisant une macro...
    Par Gogoye dans le forum C
    Réponses: 2
    Dernier message: 29/10/2003, 14h22

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