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 :

Incrémentation de void*


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut Incrémentation de void*
    Bonjour, je sèche sur le problème suivant :

    void* mypData;
    /*. traitement.*/
    (char*)mypData++;

    Le compilateur (VS2008) renvoie l'erreur suivante " '++' nécessite une l-value ". ((char*)mypData)++; pour forcer la priorité des opérateurs renvoie la même erreur.

    N.B. le problème est simplifié au maximum. En fait il s'insère dans un switch / case traitant un ensemble de type attendus. Il s'agit bien entendu d'incrémenter l'adresse mémoire contenu par la variable et non pas la valeur de la donnée pointée.

    Merci de votre attention.

  2. #2
    Expert confirmé
    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
    Par défaut
    Une possibilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mypData = (char*)mypData+1;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut
    Bingo,

    Merci diogène, tu m'as fait gagner beaucoup de temps.
    J'aurais probablement fini par trouver mais avec beaucoup d'énervement à la clé.
    Encore merci.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut
    Je ne suis pas convaincu par ton 5++ . En effet le même compilateur accepte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* toto;
    (int*)toto++;
    Cela n'enlève rien à la qualité de ta suggestion qui semble être la seule possible .
    Peut être s'agit-il d'un traitement particulier du compilateur pour ce genre de syntaxe appliqué au type void* ...

  5. #5
    Expert confirmé
    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
    Par défaut
    Effectivement, dans l'interprétation que je donnais, il y avait une erreur dans les priorités (j'édite mon post en conséquence). J'ai regardé trop sommairement et le diagnostic " '++' nécessite une l-value " m'a conduit directement à cette erreur.

    Pour résumer :
    est interprété comme
    ce qui n'aurais jamais dû conduire au diagnostic bizarre "'++' nécessite une l-value " (mypData est bien une lvalue) mais à un diagnostic du genre "la taille du type void est inconnue", "opération illégale sur un void*" ou quelque chose de ce genre. Ce qui explique que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* toto;
    ....
    (int*)toto++;
    passe très bien mais ne fait pas ce que tu semblais vouloir faire : ajouter sizeof(int) à toto. Il ajoute simplement sizeof(char), donc 1. Le cast ne sert à rien et le code équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* toto;
    ....
    toto++;
    Par contre, l'écriture
    doit conduire à " '++' nécessite une l-value " .
    Bien que cette construction soit abusivement acceptée par certains compilateurs, la norme précise que l'opérateur de cast ne donne pas une lvalue (autrement dit, on peut changer le type d'une valeur mais pas celui d'un objet). On est là dans une expression du genre 5++.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Par défaut
    Je m'incline devant ton insistance .
    Tabernacle, moi qui croyais être aguerri dans la manipulation des ptr et des casts ...
    Une méditation de noob en plus sur ma pile, je présume !
    Merci pour ta patience.

    Edit : Je n'en crois pas mes méninges : Grâce à ta pugnacité tout autant qu'a ton honnêteté intellectuelle : j'ai pu dépiler une "guru méditation"(çà n'arrive pas souvent). La compréhension de ma faute est limpide désormais. Mon hémisphère droit te dit merci .

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

Discussions similaires

  1. Manipulation de void*
    Par KORTA dans le forum C
    Réponses: 17
    Dernier message: 02/09/2003, 22h39
  2. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19
  3. TRaduction C++ => Delphi VOID ??
    Par escafr dans le forum Langage
    Réponses: 6
    Dernier message: 20/02/2003, 10h39
  4. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10
  5. Post incrémentation?
    Par Defrag dans le forum C
    Réponses: 4
    Dernier message: 08/10/2002, 10h36

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