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 :

Pointeur converti en string puis reconverti en pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut Pointeur converti en string puis reconverti en pointeur
    Bonjour,

    Sur du code legacy, il y a une manipulation de pointeur qui se trouve être particulièrement moche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Enregistrement du pointeur sous forme de chaine de caractère avec d'autres choses  avant
    sprintf(sDescReq,"%s*%i",_sName,(int)Desc);
    //Récupération de la partie pointeur de la chaine de caractère
    // Note : Toujours pas compris l'utilité du +1 ici
    sTempo = strrchr(sDescReq,'*')+1;
    // Conversion barbare de la chaine de caractère en pointeur de truc.
    Desc = (SQLDA *)atoi(sTempo);
    Dans un optique de passage en 64 bits, il y a eu une correction rapide apporté et test sur une machine AIX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Enregistrement du pointeur sous forme de chaine de caractère avec d'autres choses  avant
    sprintf(sDescReq,"%s*%L",_sName,(long)Desc);
    //Récupération de la partie pointeur de la chaine de caractère
    // Note : Toujours pas compris l'utilité du +1 ici
    sTempo = strrchr(sDescReq,'*')+1;
    // Conversion barbare de la chaine de caractère en pointeur de truc.
    Desc = (SQLDA *)atol(sTempo);
    Il se trouve que ce version ne fonctionne pas sous Windows. Car, le %L de rajoute rien dans la chaine de caractère.
    Note : Je suppose que %L n'est pas reconnu par le compilateur Windows (32 bits) de la même manière que le compilateur AIX (32bits ou 64 bits)

    J'ai fait un peu de recherche et je suis tombé sur une solution qui fonction pour Windows 32 bits qui utilise %lld Cependant, cela ne fonctionne pas sous AIX
    Il m'est totalement possible de faire un #ifdef en fonction de l'OS ciblé, mais pas envie !

    Je sais que l'ensemble est basé sur un principe à la *** et que l'implémentation n'est de toute façon pas valable. Je suppose que le plus logique serai d'utiliser %p. Mais, cela transcrit le pointeur en hex et je ne sais pas comment reconvertir cela en un pointeur propre de manière simple.

    Donc, si vous avez une manière de rendre ce stockage d'adresse de pointeur plus propre et compatible AIX/Windows 32/64 bits, je prends !

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  2. #2
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,
    tes compilateurs sont-ils tous les deux au moins en C99 ? si oui, ne caste plus les pointeurs en int (de toute façon sous windows int=long en 32 et 64bit), mais utilises %p dans le sprintf. Pour récupérer les valeurs dans l'autre sens fait un sscanf. Ce devrait être suffisamment portable

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Je suis en C90 sur la machine Windows. Je suppose que je vais garder le cast...
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Attention sous windows tu as sizeof(int)=sizeof(long)=4 en 32 et 64 bits, or en 64bits sizeof(void *)=8 ...

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Hello,

    Question bête, mais as-tu essayé avec %ld ?

    Sinon, le +1 s'explique assez simplement : le strrchr recherche le caractère '*' dans la chaîne, et pointe dessus. Le +1 permet d'avancer d'un caractère, c'est à dire de passer l'étoile.

    Par contre, est-ce que Desc peut contenir un caractère '*' ou pas ? Parce que si la réponse est non, je ne vois vraiment pas l'intérêt du code...

    Et pour être tatillon : tu dis être en C90, mais dans ce cas les commentaires doivent être en /* */
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Citation Envoyé par picodev Voir le message
    Attention sous windows tu as sizeof(int)=sizeof(long)=4 en 32 et 64 bits, or en 64bits sizeof(void *)=8 ...
    Non non,
    le long en 64 bits fait une taille de 8 de même que le pointeur. D'ailleurs, quand tu as les options de compilations pour le 64 bits, tu as des warning quand tu converti un long en int, car tu perds de l'information.

    Citation Envoyé par gangsoleil Voir le message
    Question bête, mais as-tu essayé avec %ld ?
    Pas encore, je vérifie ça ! Mais, j'avoue que je n'y crois pas des masses.

    Citation Envoyé par gangsoleil Voir le message
    Sinon, le +1 s'explique assez simplement : le strrchr recherche le caractère '*' dans la chaîne, et pointe dessus. Le +1 permet d'avancer d'un caractère, c'est à dire de passer l'étoile.
    Ça semble logique au final.

    Citation Envoyé par gangsoleil Voir le message
    Par contre, est-ce que Desc peut contenir un caractère '*' ou pas ? Parce que si la réponse est non, je ne vois vraiment pas l'intérêt du code...
    Quand tu vois le reste du code, tu ne te pose pas de question sur ça...

    Citation Envoyé par gangsoleil Voir le message
    Et pour être tatillon : tu dis être en C90, mais dans ce cas les commentaires doivent être en /* */
    Les commentaires étaient juste pour explication pour le forum. Tout les commentaire de l'application sont bien en /* */Cordialement,
    Patrick Kolodziejczyk.

    Edit :
    %ld fonction en AIX 32/64 bits et sous Windows 32 bits.

    Problématique résolu, merci !
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

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

Discussions similaires

  1. pointeur sur une string ?
    Par awalter1 dans le forum Général Python
    Réponses: 8
    Dernier message: 01/03/2011, 12h52
  2. Pointeur sur une string
    Par mk_____ dans le forum C++
    Réponses: 5
    Dernier message: 10/06/2010, 12h30
  3. Réponses: 3
    Dernier message: 10/04/2009, 10h24
  4. Réponses: 3
    Dernier message: 11/08/2005, 15h54
  5. [debutant]Convertir un pointeur byte en String
    Par patmaba dans le forum SL & STL
    Réponses: 3
    Dernier message: 22/07/2005, 13h34

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