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 :

macro de fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut macro de fonction
    Bonjour,

    je reprend du code (qui compilait il y a 10 ans), et j'ai quelques problèmes avec les macros.

    Code C : 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
    #define addfield_parse_uint(x)\
    uint##x##_t addfield_parse_uint##x(char *s){\
        uint##x##_t i;\
        char c;\
        int res; \
        if(s[0] != '0' || s[1] == '\0') \
        	res = sscanf(s,"%"SCNu##x"%c",&i,&c); \
        else if(s[1] == 'x' || s[1] == 'X') \
        	res = sscanf(s + 2,"%"SCNx##x"%c",&i,&c); \
        else \
        	res = sscanf(s + 1,"%"SCNo##x"%c",&i,&c); \
        if(res != 1)\
            gep_erreur(1,"Cannot see an uint"#x" in '%s`\n",s);\
        return i;\
    }
    addfield_parse_uint(8);
    addfield_parse_uint(16);
    addfield_parse_uint(32);
    addfield_parse_uint(64);

    Quand je veux compiler ça, j'obtiens ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    D:\workspace\gliss\src\gep\gep_addfield.c: In function 'addfield_parse_uint8':
    D:\workspace\gliss\src\gep\gep_addfield.c:16:1: error: expected ')' before 'SCNx8'
    D:\workspace\gliss\src\gep\gep_addfield.c:16:1: error: expected ')' before 'SCNo8'
    (j'ai changé le numéro de ligne pour que ça colle avec la balise code au-dessus, sympa la nouvelle balise)

    Le problème c'est que je ne comprend pas grand chose aux macros.
    Là je ne comprend pas vraiment où est le problème, est-ce que quelqu'un pourrait m'expliquer ? Je n'ai pas réussi à trouver d'explications suffisamment claires sur internet (je ne connais que les #define "de base" pour remplacer une chaine par une valeur).

    Edit: Le compilateur ne renvoie d'erreur que pour la macro avec 8, celles avec 16, 32, 64 passent l'étape de la compilation.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il existe un argument du compilateur pour obtenir la pré-compilation en sortie standard: -E.

    Ça permettra de voir le résultat de la transformation des macros.

  3. #3
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Ta macro semble définir des fonctions dont le type de retour est uint##x##_t avec ## remplacé par un des paramètres 8, 16, 32 ou 64. SI tu n'as pas fait de typedef pour ces 4 types, le compilo râle, c'est ce qui se produit chez moi. Peut-être n'as tu pas donné tout le code?

    A+

    Pfeuh

  4. #4
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    J'ai rajouté l'option -E, je n'ai rien de plus en sortie, mais ça compile (je génère mes makefile avec CMake et compile avec MinGW sous Eclipse).
    Bien sûr pas d'exe, pas de link.


    Dans un fichier .h j'ai ça, donc la version avec 8 est définie pour u, mais SCNx8 et SCNo8 ne sont définis nulle part (et pourtant ça compile avec -E).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef SCNu8  
    #define SCNu8 "hhu"
    #endif
    #ifndef SCNd8
    #define SCNd8 "hhd"
    #endif
    Par inclusion, dans inttypes.h (fichier système que je n'ai pas défini), SCNu16, SCNu32 et SCNu64 sont définis.

    En fait, il faut que je rajoute les définitions pour SCNx8 et SCNu8 qui manquent (et que j'enlève l'option -E)?

    EDIT : SCNx8 et SCNu8 sont présents dans inttypes.h

  5. #5
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    J'ai enlevé -E et rajouté -v à la compilation, mais j'ai pas l'impression que çà apporte grand chose.

    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
    [ 66%] Building C object src/gep/CMakeFiles/gep.dir/gep_addfield.c.obj
    Using built-in specs.
    COLLECT_GCC=C:\Win16App\MinGW\bin\gcc.exe
    COLLECT_LTO_WRAPPER=c:/win16app/mingw/bin/../libexec/gcc/mingw32/4.5.2/lto-wrapper.exe
    Target: mingw32
    Configured with: ../gcc-4.5.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --disable-werror --build=mingw32 --prefix=/mingw
    Thread model: win32
    gcc version 4.5.2 (GCC) 
    COLLECT_GCC_OPTIONS='-O3' '-DNDEBUG' '-v' '-ID:\workspace\gliss\src\common' '-o' 'CMakeFiles\gep.dir\gep_addfield.c.obj' '-c' '-mtune=i386' '-march=i386'
     c:/win16app/mingw/bin/../libexec/gcc/mingw32/4.5.2/cc1.exe -quiet -v -ID:\workspace\gliss\src\common -iprefix c:\win16app\mingw\bin\../lib/gcc/mingw32/4.5.2/ -DNDEBUG D:\workspace\gliss\src\gep\gep_addfield.c -quiet -dumpbase gep_addfield.c -mtune=i386 -march=i386 -auxbase-strip CMakeFiles\gep.dir\gep_addfield.c.obj -O3 -version -o c:\temp\ccPWWGRC.s
    GNU C (GCC) version 4.5.2 (mingw32)
    	compiled by GNU C version 4.5.2, GMP version 5.0.1, MPFR version 2.4.1, MPC version 0.8.1
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
    ignoring nonexistent directory "c:\win16app\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../mingw32/include"
    ignoring nonexistent directory "/mingw/include"
    ignoring duplicate directory "c:/win16app/mingw/lib/gcc/../../include"
    ignoring duplicate directory "c:/win16app/mingw/lib/gcc/../../lib/gcc/mingw32/4.5.2/include"
    ignoring duplicate directory "c:/win16app/mingw/lib/gcc/../../lib/gcc/mingw32/4.5.2/include-fixed"
    ignoring nonexistent directory "c:/win16app/mingw/lib/gcc/../../lib/gcc/mingw32/4.5.2/../../../../mingw32/include"
    ignoring nonexistent directory "/mingw/include"
    #include "..." search starts here:
    #include <...> search starts here:
     D:\workspace\gliss\src\common
     c:\win16app\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include
     c:\win16app\mingw\bin\../lib/gcc/mingw32/4.5.2/include
     c:\win16app\mingw\bin\../lib/gcc/mingw32/4.5.2/include-fixed
    End of search list.
    GNU C (GCC) version 4.5.2 (mingw32)
    	compiled by GNU C version 4.5.2, GMP version 5.0.1, MPFR version 2.4.1, MPC version 0.8.1
    GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
    Compiler executable checksum: 48c0bd49e9a9404f24c600b71b435d06
    D:\workspace\gliss\src\gep\gep_addfield.c: In function 'addfield_parse_uint8':
    D:\workspace\gliss\src\gep\gep_addfield.c:129:1: error: expected ')' before 'SCNx8'
    D:\workspace\gliss\src\gep\gep_addfield.c:129:1: error: expected ')' before 'SCNo8'
    D:\workspace\gliss\src\gep\gep_addfield.c: In function 'addfield_parse_int8':
    D:\workspace\gliss\src\gep\gep_addfield.c:149:1: error: expected ')' before 'SCNx8'
    D:\workspace\gliss\src\gep\gep_addfield.c:149:1: error: expected ')' before 'SCNo8'
    mingw32-make[2]: *** [src/gep/CMakeFiles/gep.dir/gep_addfield.c.obj] Error 1
    mingw32-make[1]: *** [src/gep/CMakeFiles/gep.dir/all] Error 2
    mingw32-make: *** [all] Error 2

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ce que dit le man gcc :
    -E Stop after the preprocessing stage; do not run the compiler proper. The output is in the form of preprocessed source code, which is sent to the standard output.
    J'ai pas réussi à trouver d'info sur l'équivalent mingw, mais ça m'étonnerait que cette option ait été supprimé.

  7. #7
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    Il ne reconnait pas les macro SCNx8 et SCNo8 (ou bien elles n'existent pas dans l'include). A toi de les définir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef SCNu8
        #define SCNu8 "hhu"
    #endif
    #ifndef SCNd8
        #define SCNd8 "hhd"
    #endif
    #ifndef SCNx8
        #define SCNx8 "hhx"
    #endif
    #ifndef SCNo8
        #define SCNo8 "hho"
    #endif
    Ta macro
    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
    #include <stdint.h>    // Pour uint8_t/uint16_t etc.
     
    #define addfield_parse_uint(x)\
    uint##x##_t addfield_parse_uint##x(char *s)             \
    {                                                       \
        uint##x##_t i ;                                     \
        char c ;                                            \
        int res ;                                           \
        if(s[0]!='0' || s[1]=='\0')                         \
            res = sscanf(s,"%"SCNu##x"%c", &i, &c) ;        \
        else if(s[1]=='x' || s[1]=='X')                     \
        	res = sscanf(s + 2,"%"SCNx##x"%c", &i, &c) ;    \
        else                                                \
        	res = sscanf(s + 1,"%"SCNo##x"%c", &i, &c) ;    \
        if(res!=1)                                          \
            printf("Cannot see an uint"#x" in '%s'\n", s) ; \
        return i ;                                          \
    }
    nota: J'ai remplacer gep_erreur par un printf.

    Ta déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        // Fonction pour un octet
        addfield_parse_uint(8) ;
    Il faut faire pareil pour 16, 32 et 64 biensûr.

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

Discussions similaires

  1. [VBA-E] Lancement d'une macro en fonction du contenu d'une cellule
    Par Zak Blayde dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/01/2007, 15h13
  2. [Macro] Exécuter une macro en fonction d'un contrôle
    Par sugan dans le forum VBA Access
    Réponses: 6
    Dernier message: 02/10/2006, 16h02
  3. Macro en fonction d'une sélection de plage de cellules.
    Par Labiche dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/08/2006, 10h23
  4. [VBA-E] macro avec fonction "TRANSPOSE"
    Par Ardeciel dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 12/06/2006, 16h11
  5. choix entre macro et fonction
    Par remi77 dans le forum C
    Réponses: 4
    Dernier message: 22/10/2003, 14h26

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