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 :

mettre un tableau dans un void*


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut mettre un tableau dans un void*
    Bonjour,
    J'ai un petit problème sur un projet.
    Je doit passer à une fonction une variable de type void*.
    Or cette variable est un tableau qui contient une variable de type FILE* en case 0 et un int en 1.
    Je ne sais pas trop comment passer et récupérer une telle variable.

    Pouvez vous m'aider ?
    Merci.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Il te suffit d'effectuer des cast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MonType * maVariable;
    void * data = (void *)maVariable;
    MonType * maSecondeVariable = (MonType *)data;
    Sachant qu'un tableau est un implicitement convertit en un pointeur sur le premier élément, cela revient au même avec un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tab maTab[];
    void * data = (void *)maTab;
    Tab * maTab2 = (Tab *)data;

  3. #3
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    En effet, le cast implicite est une solution possible....

    Mais pourquoi dois-tu passer un void * ?
    Quel est le prototype exacte de ta fonction qui "prend un void*" ?
    Peut-elle prendre autre chose que ton tableau en paramètre ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut
    D'accord merci, je vais tester ça.
    C'est pour un projet, je doit appeler la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void dessinerUnElement(pointeur elt, pointeur data)

    pointeur est un simple typedef de void*.

    l'énoncé dit :
    data est un tableau :
    -le premier élément est le pointeur sur le fichier dans lequel il faut écrire la description dot de l'élément à dessiner.
    -le deuxième élément est la chaine de caractere representant ....

    C'est la prof qui à écrit cette fonction et elle l'utilisera pour testé mon projet.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut
    J'y arrive pas, j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pointeur tab[2];
    tab[0]=(pointeur)f;
    tab[1]=(pointeur)1;
    Pour passer le tableau a la fonction.

    Dans la fonction je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pointeur tab[2]=(pointeur )data;
    FILE* f = (FILE*)tab[0];
    int port = (int)tab[0];
    Et j'ai un problème avec les lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pointeur tab[2]=(pointeur )data;
    main.c:13:2: error: invalid initializer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int port = (int)tab[0];
    main.c:15:13: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut
    Bon en fait c'est bon j'ai donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pointeur* tab=malloc(sizeof(pointeur)*2);
    tab[0]=(pointeur)f;
    tab[1]=(pointeur)1;
    et dans la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pointeur* tab=(pointeur*)data;
    FILE* f = (FILE*)tab[0];
    int port = (int)tab[1];
    J'ai juste une erreur sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int port = (int)tab[1]
    warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je ne sais pas pourquoi tu fais cela ou plutôt qui a fait le prototype de la fonction appelée mais cela me parait casse figure et un rien tordu. Mais bon...

    Ton problème est que tu cast (sauvagement) un pointeur en int. Un pointeur peut faire 64 bits (suivant le modèle de mémoire que tu utilises) et un int peut faire 32 bits. Il y a donc risque de perdre de l'information et c'est ce que te dit le warning
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 19
    Par défaut
    C'est la prof qui veux ça, normalement je suis pas censé codé la fonction de dessin mais je suis obligé pour testé.
    En fait, c'est une chaîne de caractère que je doit mettre. Du coup je déclare un char* et je le passe. Comme ça plus de problèmes.

    Je viens de testé c'est tout bon.
    Merci pour votre aide.

  9. #9
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Bonjour,

    Il te suffit d'effectuer des cast :
    Euh... En C, le transtypage est implicite.

    Par ailleurs, en C99/C11, il y a (u)intptr_t pour récupérer un pointeur dans un entier. C'est plus élégant qu'une violente récupération dans un int. Sinon, ce que tu es en train de faire me semble très étrange. Actuellement, tu essayes d'allouer génériquement un gros bloc de de données, et de « typer » ça à la main ! Sans compter que tu récupères ensuite tes données dans un objet de type différent et de bornes insuffisantes. C'est assez bizarre comme méthodologie de programmation, tu es certain que c'est ce que ton professeur te demande ?
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Kirilenko Voir le message
    C'est assez bizarre comme méthodologie de programmation, tu es certain que c'est ce que ton professeur te demande ?
    C'est un peu la réaction qu'ont eu d'autres personnes (dont je suis) dans ce post. En tout cas, je pense que c'est une excellente méthode pour apprendre à utiliser le débogueur (qui a dit "forcer")
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    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
    l'énoncé dit :
    data est un tableau :
    -le premier élément est le pointeur sur le fichier dans lequel il faut écrire la description dot de l'élément à dessiner.
    -le deuxième élément est la chaine de caractere representant ....

    C'est la prof qui à écrit cette fonction et elle l'utilisera pour testé mon projet.
    Ce n'est donc pas un tableau puisque les 'éléments' n'ont pas le même type.

    Je crois probable que l'énoncé ou le sujet ou ce qu'attend cette fonction comme arguments a été mal compris par le PO. Il y a trop de trucs qui semblent inutilement absurdes.

  12. #12
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Certains professeurs nomment "tableau" une structure. C'est une pratique désagréable, et engendrant de nombreuses confusions.
    Si c'est ton cas, transmets lui nos plus sincères animosités

Discussions similaires

  1. mettre un tableau dans un hiddenfield
    Par tortuegenie dans le forum ASP.NET
    Réponses: 8
    Dernier message: 15/02/2008, 11h44
  2. Mettre un tableau dans une Info bulle
    Par 2michel dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/10/2007, 10h31
  3. Mettre un tableau dans une DataGrid
    Par Fred677 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 06/07/2007, 12h02
  4. [Tableaux] Mettre un tableau dans un champ caché
    Par -Neo- dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2007, 11h49
  5. [MySQL] mettre un tableau dans une table mysql
    Par lodan dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 16/11/2006, 23h13

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