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 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 Utilisation de void**
    Salut a tous,
    Décidemment en ce moment, j'ai plein de petites questions dont je ne trouve pas la réponse même avec de la documentation...
    Donc pour en revenir au sujet du topic, je me demandais tout simplement s'il était possible d'utiliser void** dans une fonction; Je pose cette question car le compilateur me renvoie des warnings avec le code suivant:
    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
     
    void crypt(void** mem,int taille)
    {
    /*
     Ici j'aimerais réallouer l'espace memoire 
     du genre:
     (char*) *mem= (char*) realloc ((char*)*mem,taille+10);
    Possible ?
    */
    }
     
    main()
    {
    char* tocrypt=(char*)malloc(sizeof("voila"));
    strcpy(tocrypt,"voila");
    crypt(&tocrypt,sizeof(voila));
    }
    Quelqu'un trouve une explication au warning ?!!
    aes32.c:648: warning: passing arg 1 of `crypt' from incompatible pointer type
    A bientot et je tiens a remercier ceux qui ont deja répondu a mes questions et par avance a ceux qui vont le faire.
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Il faut caster tes differents pointeurs (voir utiliser des pointeurs de differents types pointant au meme endroit) afin de fournir un void** a ta fonction.

  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 Re: Utilisation de void**
    Effectivement en réalisant,
    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
     
    void crypt(void** mem,int taille)
    {
    /*
     Ici j'aimerais réallouer l'espace memoire 
     du genre:
     (char*) *mem= (char*) realloc ((char*)*mem,taille+10);
    Possible ?
    */
    }
     
    main()
    {
    char* tocrypt=(char*)malloc(sizeof("voila"));
    strcpy(tocrypt,"voila");
    crypt((void**)&tocrypt,sizeof(voila));
    }
    Le warning disparait comme par magie, merci encore gl pour ton aide précieuse encore une fois..

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

  4. #4
    Membre du Club

    Inscrit en
    Mai 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 39
    Points : 67
    Points
    67
    Par défaut
    KORTA, pour info, voici le prototype de realloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *realloc(void *ptr, size_t size);
    Pas la peine de tout caster !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (char*) *mem= (char*) realloc ((char*)*mem,taille+10);
    Peut et DOIT être simplifié en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *mem= realloc (*mem,taille+10);
    pas la peine de caster un void* en char* pour lui affecter un void* que tu castes lui aussi en char*. tu dois faire void* = void*
    et pas void* -> char* = char* <- void*, ça simplifie tout et c'est beaucoup plus correct.

  5. #5
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    je vois surtout pas l'interet de passer par des void* si tu fais que des allocations de char*
    il y a du linge sur la corde à linge

  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 la drogue c'est mal
    je vois surtout pas l'interet de passer par des void* si tu fais que des allocations de char*
    Je ne connais pas le type de la zone mémoire que je recois, cela peut etre effectivement des (char*) mais peut etre aussi tres bien (int*) : c'est d'ailleurs principalement pour cette derniere raison que j'utilise des void*.
    Par ailleurs, dans la fonction je manipule la zone sous forme de (int*) , c'est pour cela que j'utilise des pointeurs "génériques"
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

  7. #7
    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 leneuf22
    KORTA, pour info, voici le prototype de realloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *realloc(void *ptr, size_t size);
    Pas la peine de tout caster !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (char*) *mem= (char*) realloc ((char*)*mem,taille+10);
    Peut et DOIT être simplifié en :
    A noter que je ne suis pas tout a fait d'accord avec le DOIT car il est tout a fait possible d'utiliser autrement que ce que tu cites par la suite .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *mem= realloc (*mem,taille+10);
    pas la peine de caster un void* en char* pour lui affecter un void* que tu castes lui aussi en char*. tu dois faire void* = void*
    et pas void* -> char* = char* <- void*, ça simplifie tout et c'est beaucoup plus correct.
    Effectivement, je viens de me rendre compte qu'il n'était pas obligatoire de caster en un type particulier, néammoins on m'a toujours appris a caster dans un souci de rigueur.
    A bientot mais a premiere vue je vais utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *mem= (void*) realloc (*mem,taille+10);
    ,
    Merci pour la petite précision !
    TOUT CE QUI EST VRAISEMBLABLE N'EST PAS FORCEMENT VRAI . MEFIEZ VOUS

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

Discussions similaires

  1. Probleme utilisation const void*
    Par mansgueg dans le forum C++
    Réponses: 5
    Dernier message: 07/03/2011, 20h39
  2. quand utiliser public void
    Par nulenjava dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 14/02/2011, 18h23
  3. Utilisation de void* avec structures
    Par LaMainSurLeKatana dans le forum C++
    Réponses: 10
    Dernier message: 15/09/2010, 23h56
  4. utilisation du void
    Par Elessar01 dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 16/04/2008, 09h57
  5. Utilisation de void*
    Par vinzzzz dans le forum C
    Réponses: 4
    Dernier message: 21/10/2006, 17h40

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