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 :

Passage de tableau à une fonction par pointeur


Sujet :

C++

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut Passage de tableau à une fonction par pointeur
    Bonjour à tous et toutes !

    J'ai une fonction générique, qui prend en entrée une adresse de tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mafonction(Void *Buffer, int count) {
    ...
    }
    Avant l'appel, un tableau est créé, mais son type peut varier suivant les moments dans le programme. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char buf[4];
    mafonction(buf, 4);
    Mais comment gérer le fait que c'est un unsigned char dans ma fonction ?

    Merci d'avance !

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2005
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Il faut que tu "transtype" ton tableau dans la fonction pour que tu puisses l'utiliser comme tu le souhaites :

    mafonction(Void *Buffer, int count) {

    unsigned char[] tab = (unsigned char[]) Buffer;
    }

    Voila essayes avec ca !!!

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    OK, mais ça suppose que je sache de quel type est mon tableau.
    Ici, dans l'exemple, c'est un unsigned char, mais la même fonction peut très bien servir avec des int, ou autre !

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ça, ça ressemble plus à du C qu'à du C++.
    En conséquence, je te conseille de jeter un oeil au prototype de la fonction C qsort(), ça montre bien comment manipuler des tableaux génériques...

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il y a sûrement une meilleure solution (genre un template), mais il faudrait d'abord savoir à quoi sert ta fonction. Elle fait quoi comme traitement sur ce tableau ?

  6. #6
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    OK, je pensais que ce n'était pas trop important .
    Donc, la fonction va aller lire un fichier, et donc count octets.
    Cette fonction utilise un buffer (de type DWORD), et elle retourne le nombre d'octets lus, dans un tableau. Cependant, le tableau, comme je l'ai écrit, peut être de type unsigned char, mais aussi de type int, ou autre !
    Du coup, elle prend un void* en paramètre d'entrée, et c'est par là que ça doit "ressortir" .

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Du coup, elle prend en paramètre un type template T* et le problème est réglé !

  8. #8
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Je ne maitrise pas ce concept...
    Cependant, la fonction est ReadFile() de l'API Windows.
    Elle a pour arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BOOL ReadFile(
      HANDLE hFile,
      LPVOID lpBuffer,
      DWORD nNumberOfBytesToRead,
      LPDWORD lpNumberOfBytesRead,
      LPOVERLAPPED lpOverlapped
    );
    Vous aurez compris que lpBuffer est mon buffer type (void*) passé en argument.
    Mon problème, donc, c'est de faire en sorte que j'ai mes 4 octets dans mes quatre cases de mon tableau de unsigned char en sortie de la fonction...

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu ne fais que lire une séquence d'octets peu importe leur type, pourquoi ne pas faire une copie brute de ton DWORD* vers ton void* ?

    Si ce n'est pas une lecture d'octets, alors effectivement un template fera l'affaire.

  10. #10
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Ben, alors j'ai dû zapper une étape, car lorsque je fais cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //(rappel: count=4 octets, pvbuffer type Void*)
    DWORD *buffer = new DWORD[count];
    iRetv = ReadFile(m_iFileHandle, buffer, count, &dwNumRead, NULL);
    pvbuffer = buffer;
    Que je regarde le contenu de buffer, c'est bon, et quand je sors de la fonction, et que je regarde le contenu de mon tableau de unsigned char, ça n'est plus bon !

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Je parie que pvbuffer est un paramètre et qu'il est passé par valeur ?

  12. #12
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char auchar[4];
    read(auchar, 4, bytesread);
    read est la fonction, déclarée ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read(void* pvbuffer, int count, int &bytesread)

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et pourquoi pas lire directement dans le buffer de destination ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadFile(m_iFileHandle, reinterpret_cast<DWORD*>(pvbuffer), count, &dwNumRead, NULL)
    Par contre attention à la taille : tu vas lire count * sizeof(DWORD) ; si tu as un buffer de char il faudra donc qu'il contienne plus de count éléments.

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce que voulait dire Médinoc, c'est que si tu veux modifier ton paramètre pvbuffer dans la fonction, il faut le prendre par référence, sinon c'est une copie du pointeur que tu vas modifier et cela n'aura aucune incidence sur le pointeur que tu as passé à la fonction.

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Hum... Autre question : si c'est bien le ReadFile de l'API Win32, pourquoi lui passer un DWORD* alors qu'il prend en paramètre un LPVOID (void*) ?

  16. #16
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Excellente question, je n'ai pas bien lu en fait .

    Bon, ben merci, problème résolu grâce à vous !

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

Discussions similaires

  1. Passage de tableau à une fonction Lua en C
    Par astro01 dans le forum C
    Réponses: 4
    Dernier message: 28/05/2015, 10h07
  2. Passage tableau à une fonction
    Par label55 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 12/12/2007, 17h19
  3. Passage de tableau à une fonction: pb de debugger
    Par Felipe_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/12/2007, 09h26
  4. Réponses: 11
    Dernier message: 27/06/2007, 15h06
  5. Réponses: 8
    Dernier message: 10/03/2006, 17h28

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