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 :

Manipulation de void*


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut Manipulation de void*
    Salut ,
    J'ai un problème sur lequel je n'ai pas vraiment réfléchi, mais avant de le faire je vous propose de me donner vos idées qui me permettront de m'orienter:
    j'ai une fonction du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void func(void* data,int data_size)
    Sachant que le data peut etre un pointeur sur n'importe quel type , comment puis je faire des opérations sur data ?
    Pensez vous que l'utilisation de sizeof soit la solution ?


    A bientot
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Tu peux peut être utiliser sizeof(void) puisqu'il y a compatibilite entre le type et void.

    Sinon, tu peux essayer de faire un patron de fonction si tu connais le c++.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par sdenis
    Tu peux peut être utiliser sizeof(void) puisqu'il y a compatibilite entre le type et void.

    Sinon, tu peux essayer de faire un patron de fonction si tu connais le c++.
    Impossible pour moi d'uitlise le c++, je doi utiliser le C ANSI, je ne peux donc pas utiliser des mecanismes d'abstraction qu'offre le c++
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  4. #4
    Membre régulier Avatar de Hypnos
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2002
    Messages : 87
    Points : 108
    Points
    108
    Par défaut
    paix et félicité,

    tu ne peux pas utilsié typeid ? Je ne c pas si c'est du C ou du C++.
    Errare humanum est ... sed humanus naturae erratum est.

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Hypnos

    tu ne peux pas utilsié typeid ? Je ne c pas si c'est du C ou du C++.
    typeid est du C++.

    Je pense qu'il doit y a avoir des choses sur la manipulation de void* dans des tutoriels.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Hypnos
    paix et félicité,

    tu ne peux pas utilsié typeid ? Je ne c pas si c'est du C ou du C++.
    je connais pas typeid , je t'avoue que c'est la premiere fois que j'en entends parler mais si c'est du c++ c'est pas la peine d'y penser.
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  7. #7
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    un sizeof sur le type void ne marche pas !!
    J'ai deja posé une question presque similaire...
    le type de data peut etre n'importe quoi ?? ou bien juste numérique ?
    On m'avait suggeré de faire une surcharge de fonction (C++), c'est-a-dire créer la meme fonction mais avec un type différent a la place void... comme ca le compilo saura tout seul laquelle appeler...
    Sinon, tu peux passer utiliser sizeof sur la variable que tu va passer mais pas de sizeof dans la fonction elle meme (car type void).
    Ensuite, tu castes.

    Nas'

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    sizeof ça marche à la compilation !!!
    C'est comme si le compilateur remplaçait ton code sizeof(...) par un entier qu'il s'est chargé de calculer.

  9. #9
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Et ce serait quoi le
    type différent de void?
    Merci

  10. #10
    Membre éprouvé
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Points : 1 166
    Points
    1 166
    Par défaut
    j'ai pas essayé mais j'ai deja lu que si p était un ptr de type void alors sizeopf(*p) n'avait pas de sens !
    Si ca marche, tant mieux ...

    Nas'

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par NaskY
    un sizeof sur le type void ne marche pas !!
    J'ai deja posé une question presque similaire...
    le type de data peut etre n'importe quoi ?? ou bien juste numérique ?
    On m'avait suggeré de faire une surcharge de fonction (C++), c'est-a-dire créer la meme fonction mais avec un type différent a la place void... comme ca le compilo saura tout seul laquelle appeler...
    Sinon, tu peux passer utiliser sizeof sur la variable que tu va passer mais pas de sizeof dans la fonction elle meme (car type void).
    Ensuite, tu castes.

    Nas'
    Au début j'avais pensé a faire une surchage des fonctions mais comme void* est un pointeur sur n'importe quel type je me suis dit qu'il était probablement possible de l'éviter.
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par KORTA
    Citation Envoyé par NaskY
    un sizeof sur le type void ne marche pas !!
    J'ai deja posé une question presque similaire...
    le type de data peut etre n'importe quoi ?? ou bien juste numérique ?
    On m'avait suggeré de faire une surcharge de fonction (C++), c'est-a-dire créer la meme fonction mais avec un type différent a la place void... comme ca le compilo saura tout seul laquelle appeler...
    Sinon, tu peux passer utiliser sizeof sur la variable que tu va passer mais pas de sizeof dans la fonction elle meme (car type void).
    Ensuite, tu castes.

    Nas'
    Au début j'avais pensé a faire une surchage des fonctions mais comme void* est un pointeur sur n'importe quel type je me suis dit qu'il était probablement possible de l'éviter.
    oui mais la surcharge c'est du C++
    void * est un pointeur sur n'importe quoi, mais sans l'information de ce qu'est ce n'importe quoi, de toute maniere il te faudr quand meme gerer le cas ou tu ne connais pas de n'importe quoi...

    la solution est sans douet de faire un enum avec les differents cas à passer à ta fonction....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    enum
    {
    CHAR,
    SHORT,
    INT,
    LONG,
    FLOAT,
    DOUBLE,
    ...
    };

  13. #13
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Beh je vois pas ou est le probleme

    Si c toi qui ecris la fonction qui reçois un void* suffit de transtyper al'inetrieur de ta fonction puisque c toi qui l'appelle

    d'aileurs une fonction de thread reçoit bien un void* mais kan tu passes un param a un thread t censé savoir ce que tu passes et donc faire le transtypage qu'il faut

    A moins que tu veux pouvoir appeller ta fonction aussi bien avec un int que avec un char ou autre par exemple

    Dans ce cas si tu fais du c tu ne pourras pas le faire
    En tout cas je dirais plutot que je vois pas comment
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  14. #14
    Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 57
    Points
    57
    Par défaut
    Il faut que tu précise les opérations que tu veux faire.

    Si les opérations sont indépendantes du type comme une recopie par exemple, tu peux caster ton void* en char* puis recopier N fois 1 char (N étant la taille passé en parametre a ta fonction)

    Si certaines opérations dépendent du type, il faut que tu passes un pointeur de fonction en parametre de ta fonction pour les éffectuer.

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par sylvain114d
    Il faut que tu précise les opérations que tu veux faire.
    Si les opérations sont indépendantes du type comme une recopie par exemple, tu peux caster ton void* en char* puis recopier N fois 1 char (N étant la taille passé en parametre a ta fonction)
    Cette solution me convient , je pense qu'elle est completement adaptée a mon probleme!
    Merci pout ton renseignement, il faudra juste que ma fonction qui manipule le void* utilise un paramètre de plus pour indiquer la taille de la donnée.

    A bientot et merci a tous pour les réponses
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par hegros
    Beh je vois pas ou est le probleme

    Si c toi qui ecris la fonction qui reçois un void* suffit de transtyper al'inetrieur de ta fonction puisque c toi qui l'appelle

    d'aileurs une fonction de thread reçoit bien un void* mais kan tu passes un param a un thread t censé savoir ce que tu passes et donc faire le transtypage qu'il faut

    A moins que tu veux pouvoir appeller ta fonction aussi bien avec un int que avec un char ou autre par exemple

    Dans ce cas si tu fais du c tu ne pourras pas le faire
    En tout cas je dirais plutot que je vois pas comment
    Transtypage ~équivalent à castage ?
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  17. #17
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Oui transtypage = castage
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Salut,
    J'ai fait des recherches histoire de comprendre pourquoi utilisait t-on 2 termes différents pour la meme signification.
    Voici le résultat de mes recherches.

    cast:
    np. m.
    [LANGC] forçage de type en français. Opérateur du C, permettant d'avoir une conversion de type explicite, et matérialisé par une paire de parenthèse. Les parenthèses étant utilisées aussi pour les fonctions et les expressions, on s'amuse beaucoup, surtout si on rajoute des multiplications et des pointeurs...

    Articles liés à celui-ci : casting forçage de type
    transtypage:
    n. m.
    Créer une nouvelle variable contenant la valeur d'une autre avec un type différent (mais quand même compatible). Verbe associé : convertir.
    A vous de voir si vous jugez qu'il existe une différence sémantique entre les 2 termes!!
    A bientot
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

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

Discussions similaires

  1. Généricité : manipulation de void *
    Par Amroth dans le forum C
    Réponses: 5
    Dernier message: 05/11/2009, 00h33
  2. Manipulation des handle contexte
    Par rockbiker dans le forum DirectX
    Réponses: 1
    Dernier message: 09/05/2003, 18h51
  3. TRaduction C++ => Delphi VOID ??
    Par escafr dans le forum Langage
    Réponses: 6
    Dernier message: 20/02/2003, 10h39
  4. Réponses: 2
    Dernier message: 18/01/2003, 17h06
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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