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 :

What is a trouble ?!?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Billets dans le blog
    2
    Par défaut What is a trouble ?!?
    Salut tout le monde,

    Un petit pb en C, quelqu'un peu t'il m'aider?

    Dans le code suivant je cherche à obtenir les chaînes suivantes:

    "%.15s" dans la fonction printf
    "%15s" dans la fonction scanf

    le tout via les macros mais ça bug et je vois pas d'ou ça vient.

    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 <stdlib.h>
    #include <stdio.h>
    #define BUFFER_SIZE             16
    #define AZT_DATA_SIZE(x)        ((x)-1)
    #define AZT_INPUT_FORMAT(n)     % ## AZT_DATA_SIZE(n) ## s
    #define AZT_OUTPUT_FORMAT(n)    %. ## AZT_DATA_SIZE(n) ## s
     
    int main(void)
      {
        char *sp_AZT=malloc(BUFFER_SIZE);
        int i;
     
        for (i=0; i<BUFFER_SIZE; i++) sp_AZT[i]=0;
        scanf(AZT_INPUT_FORMAT(BUFFER_SIZE), sp_AZT);
        printf(AZT_OUTPUT_FORMAT(BUFFER_SIZE) "\n", sp_AZT);
        free(sp_AZT);
        return(EXIT_SUCCESS);
      }
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

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

    Au hasard, à cause de ceci ?
    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
    > gcc -Wall -Wextra main.c -c
    main.c: In function 'main':
    main.c:5:33: error: pasting "%" and "AZT_DATA_SIZE" does not give a valid preprocessing token
     #define AZT_INPUT_FORMAT(n)     % ## AZT_DATA_SIZE(n) ## s
                                     ^
    main.c:14:11: note: in expansion of macro 'AZT_INPUT_FORMAT'
         scanf(AZT_INPUT_FORMAT(BUFFER_SIZE), sp_AZT);
               ^
    main.c:5:33: error: expected expression before '%' token
     #define AZT_INPUT_FORMAT(n)     % ## AZT_DATA_SIZE(n) ## s
                                     ^
    main.c:14:11: note: in expansion of macro 'AZT_INPUT_FORMAT'
         scanf(AZT_INPUT_FORMAT(BUFFER_SIZE), sp_AZT);
               ^
    main.c:5:53: error: pasting ")" and "s" does not give a valid preprocessing token
     #define AZT_INPUT_FORMAT(n)     % ## AZT_DATA_SIZE(n) ## s
                                                         ^
    main.c:14:11: note: in expansion of macro 'AZT_INPUT_FORMAT'
         scanf(AZT_INPUT_FORMAT(BUFFER_SIZE), sp_AZT);
               ^
    main.c:6:33: error: expected expression before '%' token
     #define AZT_OUTPUT_FORMAT(n)    %. ## AZT_DATA_SIZE(n) ## s
                                     ^
    main.c:15:12: note: in expansion of macro 'AZT_OUTPUT_FORMAT'
         printf(AZT_OUTPUT_FORMAT(BUFFER_SIZE) "\n", sp_AZT);
                ^
    main.c:6:34: error: pasting "." and "AZT_DATA_SIZE" does not give a valid preprocessing token
     #define AZT_OUTPUT_FORMAT(n)    %. ## AZT_DATA_SIZE(n) ## s
                                      ^
    main.c:15:12: note: in expansion of macro 'AZT_OUTPUT_FORMAT'
         printf(AZT_OUTPUT_FORMAT(BUFFER_SIZE) "\n", sp_AZT);
                ^
    main.c:6:54: error: pasting ")" and "s" does not give a valid preprocessing token
     #define AZT_OUTPUT_FORMAT(n)    %. ## AZT_DATA_SIZE(n) ## s
                                                          ^
    main.c:15:12: note: in expansion of macro 'AZT_OUTPUT_FORMAT'
         printf(AZT_OUTPUT_FORMAT(BUFFER_SIZE) "\n", sp_AZT);
                ^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > gcc main.c -E > voyons-ca.i
     
    [...]
    int main(void)
      {
        char *sp_AZT=malloc(16);
        int i;
     
        for (i=0; i<16; i++) sp_AZT[i]=0;
        scanf(% ((16)-1) s, sp_AZT);
        printf(%. ((16)-1) s "\n", sp_AZT);
        free(sp_AZT);
        return(0);
      }
    Je te laisse corriger tes macros

  3. #3
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Billets dans le blog
    2
    Par défaut
    Le but est que cela se fasse via les macros sinon j'aurais écris le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void)
      {
        char *sp_AZT=malloc(16);
        int i;
     
        for (i=0; i<16; i++) sp_AZT[i]=0;
        scanf("%15s", sp_AZT);
        printf("%.15s\n", sp_AZT);
        free(sp_AZT);
        return(EXIT_SUCCESS);
      }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdlib.h>
    #include <stdio.h>
     
    int main(void)
      {
        char *sp_AZT=malloc(16);
        int i;
     
        for (i=0; i<16; i++) sp_AZT[i]=0;
        scanf("%" (16-1) "s", sp_AZT);
        printf("%." (16-1) "s\n", sp_AZT);
        free(sp_AZT);
        return(EXIT_SUCCESS);
      }
    La question était en faîte qu'est-ce qui cloche dans les macros.

    Plus précisément:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define AZT_INPUT_FORMAT(n)     % ## AZT_DATA_SIZE(n) ## s /* doit produire "%15s" */
    #define AZT_OUTPUT_FORMAT(n)    %. ## AZT_DATA_SIZE(n) ## s /* doit produire "%.15s" */
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par InitSreen Voir le message
    La question était en faîte qu'est-ce qui cloche dans les macros.
    Et ma réponse est que tu génères ce code-la avec tes macros actuelles (visible avec la ligne de commande en première ligne)
    Citation Envoyé par Winjerome Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > gcc main.c -E > voyons-ca.i
     
    [...]
    int main(void)
      {
        char *sp_AZT=malloc(16);
        int i;
     
        for (i=0; i<16; i++) sp_AZT[i]=0;
        scanf(% ((16)-1) s, sp_AZT);
        printf(%. ((16)-1) s "\n", sp_AZT);
        free(sp_AZT);
        return(0);
      }

  5. #5
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    359
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 359
    Billets dans le blog
    2
    Par défaut
    Ok mais concrètement la solution, c'est quoi ? et pourquoi ...
    Le gourou dicte la ligne (de commande) à suivre ...

    Penser à lire le Tutoriel Batch ou a consulter la FAQ Batch et ses contributions,
    ainsi que le Cour sur la ligne de commande et des scripts

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    La solution, c'est de regarder la documentation, et de voir pourquoi ta macro ne retourne pas une chaine.

    Un point de départ: Le préprocesseur sur cppreference.com. Le lien vers "replace" sera utile.

    La réponse c'est "pas de bras pas de chocolat": ta macro ne contient pas de chaine, elle n'en retourne pas.

Discussions similaires

  1. Makefile et instruction "what"
    Par nkdb dans le forum Systèmes de compilation
    Réponses: 3
    Dernier message: 01/12/2006, 16h30
  2. EZPDF et start_session trouble!
    Par semoyves dans le forum Langage
    Réponses: 1
    Dernier message: 05/05/2006, 08h28
  3. Réponses: 22
    Dernier message: 06/04/2006, 14h45
  4. Trouble avec Excel avec un programme qui utilise un Hook.
    Par hot_metal dans le forum Windows
    Réponses: 5
    Dernier message: 14/01/2006, 13h40
  5. Réponses: 11
    Dernier message: 08/12/2005, 16h54

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