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 :

Problèmes avec volatile


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut Problèmes avec volatile
    Bonjour;

    j' au quelques problèmes avec le qualificateur volatile.
    Voici un programme juste pour l'exemple, qui ne marche pas chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    volatile char p[50];
     
    int main (void) 
    {
        strcpy (p, "bonjour");
        return 0;
    }
    me renvoie l' erreur :
    "attention : passage de l'argument n°1 de « strcpy » annule des qualificateurs du type du pointeur cible"

    Je suis sous ubuntu, le compile de cette façon :
    gcc -o test test.c
    avec gcc 3.4.6 .

    Une idée ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par echantillon
    Bonjour;

    j' au quelques problèmes avec le qualificateur volatile.
    Voici un programme juste pour l'exemple, qui ne marche pas chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    volatile char p[50];
     
    int main (void) 
    {
        strcpy (p, "bonjour");
        return 0;
    }
    me renvoie l' erreur :
    "attention : passage de l'argument n°1 de « strcpy » annule des qualificateurs du type du pointeur cible"

    Je suis sous ubuntu, le compile de cette façon :
    gcc -o test test.c
    avec gcc 3.4.6 .

    Une idée ?
    Tel quel, ton code n'est pas correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:1: warning: implicit declaration of function `strcpy'
    main.c:1: warning: passing arg 1 of `strcpy' discards qualifiers from pointer target type
    main.c:1:77: warning: no newline at end of file
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 3 warnings
    Pour en revenir à ton problème, les fonctions standards du C ne prévoient pas de traiter des données 'volatile'. Je ne vois d'ailleurs pas trop quel sens ça aurait...

    Tu veux faire quoi exactement ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    Dans mon programme j 'initialise un thread, il est chargé de faire défiler du texte dans un label pendant que le programme continu de son côté.

    Il arrive au programme de changer ce texte et de faire des opérations dessus.

    Je compte par la suite bloquer l'accès a cette chaîne l' un et a l' autre pendant qu'ils font leurs opérations. Mais je n' en suis pas là pour le moment. Je m' intéresse juste a volatile pour éviter des résultats aléatoires.

    Et puis je souhaite aussi comprendre pourquoi srtcpy (et d' autres) bloquent a volatile. (chez moi en tout cas)

    voilà. ;°)

    edit : quelques fautes, comme-ci comme-cà.

    edit2 : Quelles options passez-vous au compilateur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gcc -o test test.c -wall
    test.c: In function `main':
    test.c:5: attention : passage de l'argument n°1 de « strcpy » annule des qualificateurs du type du pointeur cible
    même avec wall je ne reçoit pas autant d' erreurs.?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par echantillon
    Dans mon programme j 'initialise un thread, il est chargé de faire défiler du texte dans un label pendant que le programme continu de son côté.

    Il arrive au programme de changer ce texte et de faire des opérations dessus.
    Et en quoi volatile a un intérêt ici ? Il faut au contraire que tu protèges ta variable par un sémaphore, sinon, tu vas afficher n'importe quoi...

    http://emmanuel-delahaye.developpez.com/pthreads.htm

    Je compte par la suite bloquer l'accès a cette chaîne l' un et a l' autre pendant qu'ils font leurs opérations. Mais je n' en suis pas là pour le moment. Je m' intéresse juste a volatile pour éviter des résultats aléatoires.

    Et puis je souhaite aussi comprendre pourquoi srtcpy (et d' autres) bloquent a volatile. (chez moi en tout cas)
    Je pense que volatile ne fait pas ce que tu penses. Ca sert à signaler au compilateur que la valeur d'une variable peut changer extérieurement au programme et qu'il ne faut donc pas faire d'hypothèses simplificatrices au moment de l'optimisation...

    edit2 : Quelles options passez-vous au compilateur ?
    http://emmanuel-delahaye.developpez....tm#cfg_compilo

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    les fonctions standards du C ne prévoient pas de traiter des données 'volatile'.
    Pardon j' ai lu en diagonale.
    Mais du coup je ne comprend pas :

    Quel est le rapport entre la non optimisation du compilateur et les fonctions standards du C ?

    Je pense que volatile ne fait pas ce que tu penses. Ca sert à signaler au compilateur que la valeur d'une variable peut changer extérieurement au programme et qu'il ne faut donc pas faire d'hypothèses simplificatrices au moment de l'optimisation...
    Si, je l'avais bien compris comme çà.
    Donc dans le cas ou mon programme fait des test sur un chaîne, alors qu' un processus vient de la modifier (peut-être), le mot clé volatile n' est-il pas utile pour aller chercher la 'vrai' valeur de cette chaîne ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par echantillon
    Quel est le rapport entre la non optimisation du compilateur et les fonctions standards du C ?
    C'est pas toi qui voulais passer un pointeur volatile à une fonction du C (strcpy() si je me souviens bien) ?

    A partir du moment où un pointeur est 'volatile' tout ce qui suit doit l'être (c'est comme pour const...)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    C'est pas toi qui voulais passer un pointeur volatile à une fonction du C (strcpy() si je me souviens bien) ?
    Si, si !
    Je me suis mal exprimé par rapport a ça :
    les fonctions standards du C ne prévoient pas de traiter des données 'volatile'
    Je vais essayer de reformuler ce que je n'ai pas compris:
    ( dont vous(tu ? je sais jamais ici..!) me donnez un élément de réponse :

    A partir du moment où un pointeur est 'volatile' tout ce qui suit doit l'être
    Si volatile demande au compilateur de ne pas optimiser certains bout de code. En quoi une fonction peut se rendre incompatible avec volatile ?

Discussions similaires

  1. Problème avec Application.Volatile
    Par d0n32 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 19/06/2018, 11h06
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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