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 :

lire une macro definie par une variable


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut lire une macro definie par une variable
    Bonjour,

    je travaille actuellement dans un projet et j'aurai besoin de lire la valeur definit dans une macro.
    Cependant la macro change en fonction des arguments de ma fonction.
    Je cherche donc a lire la macro definit dans une variable.

    Un petit exemple pour bien me faire comprendre

    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
     
    #define macro1 "macro def 1"
    #define macro2 "macro def 2"
    #define macro3 "macro def 3"
    #define macro4 "macro def 4"
    #define macro5 "macro def 5"
     
    void function(int number){
      char format[20];
      sprintf(format,"macro%i",number);
     
       /* c'est la que j'ai besoin de lire la valeur associee a la macro definie dans format*/
      other_function(eval(format));
     
    }
    Je cherche donc a remplacer eval par une fonction qui doit bien exister en C.

    J'ai simplifier un peu l'exemple dans mon cas, j'ai 2 elements variables qui definissent la macro.
    Je cherche un moyen d'eviter une serie de if qui me semble lourde

    Merci de votre aide

    L'elfe d'Azur

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 393
    Points : 23 740
    Points
    23 740
    Par défaut
    Bonjour,

    Citation Envoyé par L'elfe d'Azur Voir le message
    Bonjour,

    je travaille actuellement dans un projet et j'aurai besoin de lire la valeur definit dans une macro.
    Cependant la macro change en fonction des arguments de ma fonction.
    Je cherche donc a lire la macro definit dans une variable.
    « définit » -> « définie ». Merci.

    Un petit exemple pour bien me faire comprendre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define macro "macro def 1"
    #define macro "macro def 2"
    #define macro "macro def 3"
    #define macro "macro def 4"
    #define macro "macro def 5"
    Erreur : tu définis ici cinq fois la même macro « macro ». Le précompilateur va raler.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void function(int number){
      char format[20];
      sprintf(format,"macro%i",number);
     
       /* c'est la que j'ai besoin de lire la valeur associee a la macro definit dans format*/
      other_function(eval(format));
     
    }
    Je cheche donc a remplacer eval par une fonction qui doit bien exister en C.
    Tu ne peux pas faire ce genre de chose puisque les macros sont résolues avant même que le programme ne soit compilé. Ton eval() n'aura rien à évaluer puisque mêmes les noms « MACROxxx » n'existeront plus dans ton exécutable final. Tu peux passer des paramètres à tes macros, qui seront repositionnés au sein de la chaîne développée, et embarquer dans celle-ci un switch() ou un opérateur ternaire, tu peux contaténer le résultat de deux macros (avec ##), transformer le résultat en chaîne (avec #), mais pas faire une structure de macros, et encore moins les indexer avec un paramètre passé au run-time.

    Utilise des tableaux de chaînes à la place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const char * table [] = {
            "def 1",
            "def 2",
            "def 3",
            "def 4",
            "def 5" };
    
    other_function(eval(table[number]));
    Et dis-nous surtout où tu veux en venir au final. Il y a de fortes chances pour que tu aies suivi dès le départ la mauvaise voie.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut
    Desole pour les fautes de frappe et oublis. J'ai corrige mon enonce.

    En fait je dois lire des fichiers de configuration pour une webcam en fonction de la hauteur et largeur de l'affichage souhaite.
    Ces fichiers sont generes par un logiciel externe. Je ne genere pas les fichiers pour tous les cas.

    Dans ma fonction initiale, j'ai en argument toute ces informations.

    Je cherche donc a lire ce qui est defini dans les bonnes macros.

    Voici le type de macros qui sont definies

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #define SET_GEOMETRY_1024x768 "ly810100\rlyd10480000055\rlyb20480018004\rlyd6034000c0\rlyb60412030e03\rly810191\r"
    #define SET_GEOMETRY_512x512  "ly810100\rlyd10480000055\rlyb204fe010204\rlyd6035500ab\rlyb60416021202\rly810191\r"
    #define SET_GEOMETRY_640x480  "ly810100\rlyd10480000055\rlyb2041002f003\rlyd6035800ac\rlyb604f201ee01\rly810191\r"
    #define SET_GEOMETRY_320x200  "ly810100\rlyd10480000055\rlyb2049c026403\rlyd6036f0091\rlyb604da00d600\rly810191\r"
     
    #define FORMATFILE_1024x768  "XCLIB/Video_1024x768.fmt"
    #define FORMATFILE_512x512   "XCLIB/Video_512x512.fmt"
    #define FORMATFILE_640x480   "XCLIB/Video_640x480.fmt"
    #define FORMATFILE_320x200   "XCLIB/Video_320x200.fmt"
    En entree de ma fonction, j'ai les variables width et weight.

    je cherche donc a lire les macros FORMATFILE_width_x_height et SET_GEOMETRY_width_x_height avec width et height valeur d'entree.
    Ces macros servent a l'initialisation des parametre de la camera.

    Cependant si j'ai bien compris ce que tu as ecrit, ces macros n'ont plus de sens lors de la compilation, elles ont ete remplace par leur valeur.
    Une solution serait declarer un tableau dans la fonction avec toutes les informations et aller chercher la bonne chaine de caractere, comme tu le proposes.

    Merci

    Melaine

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 393
    Points : 23 740
    Points
    23 740
    Par défaut
    Ok, je comprends mieux le problème.

    Vois déjà si ton logiciel tiers ne te fournit pas - en plus - ces informations sous une autre forme. Les macros ne servent en général que de raccourci au programmeur. Sinon, c'est que l'auteur du générateur considère que l'utilisateur n'exploitera toujours sa sortie que manuellement. Le problème est donc que même de cette manière, il faudra quand même te palucher à la main la recopie de chaque macro (au moins son nom) dans un tableau pour pouvoir les exploiter à loisir dans ton programme.

    Ce que je te conseille de faire, donc, est d'écrire un petit programme (en C, ou autre langage, Shell, Perl ou Python, par exemple), qui extrait chaque ligne de ton fichier et te le transforme en une déclaration valable, puis tu inclus le résultat dans ton code. Tu peux gérer cela très facilement avec des expressions régulières, par exemple.

    Ou alors, tu ouvres directement le fichier généré depuis ton programme au run-time, mais ça devient assez sauvage, à ce stade.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par L'elfe d'Azur Voir le message
    Cependant si j'ai bien compris ce que tu as ecrit, ces macros n'ont plus de sens lors de la compilation, elles ont ete remplace par leur valeur.
    Une solution serait declarer un tableau dans la fonction avec toutes les informations et aller chercher la bonne chaine de caractere, comme tu le proposes.
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <stdio.h>
    #define SET_GEOMETRY_1024x768 \
    "ly810100\rlyd10480000055\rlyb20480018004\rlyd6034000c0\rlyb60412030e03\rly810191\r"
     
    #define SET_GEOMETRY_512x512  \
    "ly810100\rlyd10480000055\rlyb204fe010204\rlyd6035500ab\rlyb60416021202\rly810191\r"
     
    #define SET_GEOMETRY_640x480  \
    "ly810100\rlyd10480000055\rlyb2041002f003\rlyd6035800ac\rlyb604f201ee01\rly810191\r"
     
    #define SET_GEOMETRY_320x200  \
    "ly810100\rlyd10480000055\rlyb2049c026403\rlyd6036f0091\rlyb604da00d600\rly810191\r"
     
    #define FORMATFILE_1024x768  "XCLIB/Video_1024x768.fmt"
    #define FORMATFILE_512x512   "XCLIB/Video_512x512.fmt"
    #define FORMATFILE_640x480   "XCLIB/Video_640x480.fmt"
    #define FORMATFILE_320x200   "XCLIB/Video_320x200.fmt"
     
    enum
    {
       FMT_1024x768,
       FMT_512x512,
       FMT_640x480,
       FMT_320x200,
       FMT_NB
    };
     
    struct format
    {
       char const *geometry;
       char const *formatfile;
    };
     
    int main (void)
    {
       static const struct format a_format[FMT_NB] = {
          {SET_GEOMETRY_1024x768, FORMATFILE_1024x768},
          {SET_GEOMETRY_512x512, FORMATFILE_512x512},
          {SET_GEOMETRY_640x480, FORMATFILE_640x480},
          {SET_GEOMETRY_320x200, FORMATFILE_320x200},
       };
     
       int i;
     
       for (i = 0; i < FMT_NB; i++)
       {
          struct format const *p = a_format + i;
          printf ("'%20s' '%20s'\n", p->geometry, p->formatfile);
       }
     
       return 0;
    }
    L'affichage est perturbé par la présence de '\r' dans les chaines 'geometry'

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 393
    Points : 23 740
    Points
    23 740
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    L'affichage est perturbé par la présence de '\r' dans les chaines 'geometry'
    Oui, mais ce n'est pas ça qui l'ennuie : un logiciel tiers lui renvoie des informations sous forme de macros dans un fichier. Donc, s'il veut pouvoir exploiter au run-time les informations qu'elle représentent, il est obligé d'invoquer chacune d'elles au moins une fois dans son code source.

Discussions similaires

  1. pilotage d'une application externe par une macro excel
    Par fribelle dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/11/2008, 14h52
  2. Suppression d'une macro VB par une macro : Problème " Mode Arrêt "
    Par CGANE dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/05/2008, 15h50
  3. Réponses: 11
    Dernier message: 19/07/2007, 10h56
  4. non prise en compte d'une formule remplie par une macro
    Par mardona dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/06/2007, 15h08
  5. [Excel] Utiliser une application externe par une macro
    Par thierry2.dlp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/08/2005, 22h07

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