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

  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.

  7. #7
    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
    Bien vu "leternel",

    J'ai relut la spec et modifié en conséquence mais c'est toujours pas ça...

    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 MKSTR(a)                # a
    #define BUFFER_SIZE             16
    #define AZT_INPUT_FORMAT(n)     MKSTR( % ## n ## s )
    #define AZT_OUTPUT_FORMAT(n)    MKSTR( %. ## 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(15), sp_AZT);
        printf(AZT_OUTPUT_FORMAT(15) "\n", sp_AZT);
        free(sp_AZT);
        return(EXIT_SUCCESS);
      }
    ça produit toujours une erreur (mais pas deux, va comprendre 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

  8. #8
    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
    scanf demande une adresse, printf une valeur.
    L'un des arguments est faux.

    Et puis, le conseil de Winjerome est le bon: fait en sorte de ne produire que le code précompilé, avant compilation. Tu sauras explicitement ce que produit ta macro.

  9. #9
    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
    pas bien vu "leternel"

    en faîte c'est la macro qui pose problème, surement un bug du pré-processeur.

    par exemple le code ci-dessous marche (c'est utile en allocation dynamique).

    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
    #include <stdlib.h>
    #include <stdio.h>
    #define BUFFER_SIZE             16
     
    int main(void)
      {
        char *sp_AZT=malloc(BUFFER_SIZE);
        int i;
     
        for (i=0; i<BUFFER_SIZE; i++) sp_AZT[i]=0;
        scanf("%15s", sp_AZT);
        printf("%.15s\n", sp_AZT);
        free(sp_AZT);
        return(EXIT_SUCCESS);
      }
    de même en prenant en compte ta remarque

    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
    #include <stdlib.h>
    #include <stdio.h>
    #define BUFFER_SIZE             16
     
    int main(void)
      {
        char ca_AZT[BUFFER_SIZE];
        int i;
     
        for (i=0; i<BUFFER_SIZE; i++) ca_AZT[i]=0;
        scanf("%15s", &ca_AZT);
        printf("%.15s\n", ca_AZT);
        free(ca_AZT);
        return(EXIT_SUCCESS);
      }
    dans les deux ya la même chaîne mais l'une est une déclaration et l'autre une allocation; la réponse est dans la façon de passer les paramètres à une fonction.
    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

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