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 va_arg, problème d'alignement de pointeur [Non suivi]


Sujet :

C

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut Utilisation de va_arg, problème d'alignement de pointeur
    Bonjour,

    J'utilise pour la 1ere fois les fonctions de stdarg.h.
    J'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void test(int nbarg, ...)
    {
                 char *ptr;
    	va_list ap;
     
    	va_start(ap,nbarg);              		
    	ptr = (char *) va_arg(ap,char *);
    }
    avec l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test(3,"abc","def,"fgh");
    et lors de la compil, j'ai le message "warning 530: Casting from loose to strict alignment" sur la ligne utilisant la fonction va_arg.
    Je ne sais pas comment éviter ce warning qui peut occasionner des pb.

    Merci de votre aide

  2. #2
    Futur Membre du Club
    Inscrit en
    Août 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Il me semble que les "fonction" va_** sont en réalité des macro et les macro ne se cast pas, retire ton (char *) avant ton appel a va_arg() et normalement tu ne devrais pas avoir de soucis

  3. #3
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par uriel0105
    Il me semble que les "fonction" va_** sont en réalité des macro et les macro ne se cast pas, retire ton (char *) avant ton appel a va_arg() et normalement tu ne devrais pas avoir de soucis
    Une macro peut très bien mapper une fonction, ce n'est pas un problème en soi de transtyper le retour d'une macro comme va_arg même si ce n'est pas nécessaire. Par contre il manque la macro va_end().

    A+

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptr = (char *) va_arg(ap,char *);
    va_arg a pour type le type spécifié en deuxième argument (char* ici). Le cast n'est pas utile.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par awalter1
    Bonjour,

    J'utilise pour la 1ere fois les fonctions de stdarg.h.
    J'ai le code suivant :
    /*******************/
    void test(int nbarg, ...)
    {
    char *ptr;
    va_list ap;

    va_start(ap,nbarg);
    ptr = (char *) va_arg(ap,char *);
    }
    avec l'appel :
    test(3,"abc","def,"fgh");
    /*******************/
    et lors de la compil, j'ai le message "warning 530: Casting from loose to strict alignment" sur la ligne utilisant la fonction va_arg.
    Je ne sais pas comment éviter ce warning qui peut occasionner des pb.

    Merci de votre aide
    La première chose est que tu as oublié la macro va_end() => comportement indéfini. Ensuite, j'ai du mal à voir comment il peut y avoir ici un pb d'alignement de pointeurs ici car va_arg est censé retourner un char*.A moins que ce soit un void*<edit>Même pas !!, cf n1124 §6.2.5 item 26</edit>. Comme c'est une macro, on ne maitrise pas ce qu'il y a derrière et il est vrai que va_arg ne s'utilise généralement pas avec des transtypages. Tu dois être sur une machine très pédante.

    L'exemple suivant fonctionne sans cast et sans complainte de mon compilo avec casts sur va_args. Config: RHEL 4, gcc 3.4.5, commande compil : gcc -std=c89 -Wall -pedantic

    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
    #include <stdio.h>
    #include <stdarg.h>
     
    void disp(char const * first, ...)
    {
       va_list ap;
       char const * ptr = NULL;
     
       va_start(ap, first);
     
       ptr = va_arg(ap, char const *);
       while(ptr) { 
        puts(ptr);
        ptr = va_arg(ap, char const *);
       }   
     
       va_end(ap);
    }
     
    int main(void) {
     
      disp("DIS BONJOUR AUX GENS", "Hello", "Bonjour", "Guten Tag", "Demat", NULL);
     
      return 0;
    }
    A+

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Foobar1329
    Tu dois être sur une machine très pédante.
    C'est sans doute le cas pour le posteur. La même remarque, avec le même diagnostic, avait déjà été postée sur ce forum il y a quelques semaines
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. problème d'alignement swing
    Par demonia dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/02/2006, 21h47
  2. Réponses: 6
    Dernier message: 20/01/2006, 19h28
  3. Réponses: 1
    Dernier message: 22/12/2005, 11h23
  4. C++ Problème de fonctions et pointeurs
    Par zmatz dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2005, 16h20
  5. Problème d'alignement
    Par zorely dans le forum Mise en forme
    Réponses: 4
    Dernier message: 09/08/2005, 10h52

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