Partage
  • Partager sur Facebook
  • Partager sur Twitter

Array de 16 pointeur

    23 juin 2008 à 16:39:45

    salut!!
    je suis entrain d'essayer d'ecrire une fonction qui doit me renvoyer un Array:

    voici le code:
    char**USBDevice::Buffercontent()
    {
            char *BufPtrs[16];
            DWORD numDevs;                                                                //pointer to array of 16 pointers
            char Buffer[16][64];                                                                //buffer for description devices
                    for(int buffer_index=0; buffer_index<15; buffer_index++)
                            BufPtrs[buffer_index] = Buffer[buffer_index];        //initialize array of pointers
                            BufPtrs[15] = NULL;                                                                        //last entry should be NULL
            ftStatus= FT_ListDevices(BufPtrs, &numDevs, FT_LIST_ALL|FT_OPEN_BY_SERIAL_NUMBER);
        return BufPtrs;
    }

    messsage d'érreur:

    address of local variable `BufPtrs' returned


    j 'aimerai bien savoir comment pour retourner un Array par cette fonction et l'écrire de manière correcte.

    merci de m'aider
    • Partager sur Facebook
    • Partager sur Twitter
      23 juin 2008 à 16:53:02

      BufPtrs est déclaré local à la fonction. À la fin de sa portée (donc, de la fonction), le tableau de pointeurs est détruit, et son pointeur est renvoyé. Il arrivera donc invalide à la fin.

      Trois solutions possibles: employer new (mais cela forcera l'appelant à faire un delete), utiliser un conteneur comme std::vector, ou laisser l'appelant créer un tableau pour ensuite laisser la fonction Buffercontent() le remplir.

      Si tu ne tiens pas à utiliser vector, sache que la technique normalement employée est la troisième (ta fonction prendra alors un paramètre un tableau de char * et le remplira).
      • Partager sur Facebook
      • Partager sur Twitter
        23 juin 2008 à 17:14:43

        C'est ce qui arrive lorsqu'on copie-colle sans essayer de comprendre...


        void USBDevice::Buffercontent( std::vector<std::string> & v )
        {
            FT_Status ftStatus;
            char *Buffer[ 16 ]= {0};  // nombre magique ?
            DWORD NbPerifs;
            
            // initialisation       
            for( int i = 0; i < 15; ++i )
            {
                 Buffer[ i ] = new char[ 64 ]; // nombre magique ?
                 *Buffer[ i ] = '\0';
            }
            
            //La fonction FT_ListDevices nécessite que la dernière entrée soit NULL
            Buffer[ 15 ] = NULL; 
        
            ftStatus = FT_ListDevices( Buffer, &NbPerifs, FT_LIST_ALL|FT_OPEN_BY_SERIAL_NUMBER );
            
           if( FT_SUCCESS( ftStatus ) )
               v.assign( Buffer, (Buffer + numDevs) );
        
           // Sinon ? Tu pourrais soulever une exception ! Ou retourner un booléen...
        
           // À ne pas oublier... même avec une exception !
           for( int i = 0; i < 16; ++i )
               delete [] Buffer[ i ];
        }
        



        J'ai été gentil... j'ai trouvé moi-même la documentation du FT_ListDevices. Là le but c'est de comprendre... j'ai été aussi assez méchant pour que tu doives te poser des questions sur mon code... alors cherche et poses-nous les questions auquels tu n'as pas de réponses.
        • Partager sur Facebook
        • Partager sur Twitter
          23 juin 2008 à 17:26:36

          tes explications sont tres breves. j´'aimerai utilisé la troisième possibilité.
          est ce que tu pourrais être un peu plus claire??

          merci
          • Partager sur Facebook
          • Partager sur Twitter
            23 juin 2008 à 18:22:31

            La solution 2 et 3 sont dans mon code exception fait que tu peux remplacer le paramètre "std::vector & v" par disons

            void USBDevice::Buffercontent( char** periferiques, DWORD & nb_periferiques )
            
            • Partager sur Facebook
            • Partager sur Twitter

            Array de 16 pointeur

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown