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 :

Problème de pointeur et d'allocation de mémoire dynamique c++


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 46
    Points : 33
    Points
    33
    Par défaut Problème de pointeur et d'allocation de mémoire dynamique c++
    Bonjour,

    J'ai une fonction qui me permet de créer un handle puis remplir un template data pour pouvoir générer un fichier .template.
    Maintenant je veux faire le contraire. Ayant un fichier .template, je veux remplir un template data à partir de ce fichier pour pouvoir avoir le handle.

    voilà le code

    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
     
             size_t  nTemplateSize=0;
             BYTE *tab = new BYTE[nTemplateSize];
    	 memset(tab, 0, sizeof(BYTE) * nTemplateSize); // value initialisé à 0 	  	
    	  FILE * fichier=fopen("C:\\Test.template","rb"); 
    	  fread(tab, sizeof(BYTE) * nTemplateSize, nTemplateSize, fichier); // lecture
    	  rewind(fichier); // revenir au début du fichier
    	  fwrite(tab, sizeof(BYTE) * nTemplateSize, &nTemplateSize, fichier); // ecriture
    	  fclose(fichier); 
    	  nRetCode = FC3SetTemplateData(hTemplate1, (BYTE *)tab, nTemplateSize, "ISO/IEC 19794-2:2005");
    	if (nRetCode!=FPC_SUCCESS)
    		printf("Error (%d) : %s\n", (int)nRetCode, FC3GetErrorDescriptionA(nRetCode));
    	//FC3DestroyHandle((FC3_t *)&hTemplate1);
    	delete [] tab;
    	// *************** Fin génerer un handle à partir d'un fichier template ************************
    sauf que je reçois toujours l'erreur :
    FPC_ERROR_TEMPLATE_SIZE : The size of the finger template is not valid.
    Qui peut m'expliquer l'astuce qui m'échappe ici svp?

    NB: Je travaille avec un SDK donc je vous mets la documentation de la fonction à la quelle j'ai fais appel:
    DRMAPI FC3SetTemplateData ( const FC3Template_t hTemplateHandle,
    const BYTE *const pTemplateData,
    const size_t nTemplateSize,
    const char *const szFormat
    )

    function to set template data

    This function is used to set external data to a fingerprint template. The user must also provide the format type of the template data. Note that you can only set template types which are supported by your license of the FingerCode3 component. A simple validity check is performed upon setting the data. This should lead to rejection of corrupt data.

    Parameters:
    [out] hTemplateHandle handle of the template to set the data to
    [in] pTemplateData pointer to a memory block containing the template data
    [in] nTemplateSize the size of the template data memory block
    [in] szFormat a string defining the format to import, please refer to the Features for supported formats, note that the supported formats also depend on your FingerCode3 license, check also that all *.dpl are located in the same directory as the dynamic library of the component

    Returns:
    error status of the function. See ErrorCodes.h for all definitions of error codes. Likely error codes are
    FPC_SUCCESS the finger template data was successfully set.
    FPC_ERROR_NOT_INITIALIZED the component is not initialized or no license has been found
    FPC_ERROR_NO_LICENCE the component has no license, currently the component is dongled to Dermalog live scanner or Dermalog Licenser
    FPC_ERROR_NO_LICENCE_INSTALLED the licenser (Dermalog live scanner or Dermalog Licenser) is not installed, please reinstall the component
    FPC_ERROR_NO_HANDLE There is no handle given (hHandle == NULL)
    FPC_ERROR_INVALID_HANDLE The handle given is invalid
    FPC_ERROR_TEMPLATE_PTR_NULL The data pointer (pTemplate) given is NULL (passing a NULL pointer is only valid in order to delete the content template handle, the size passed must be 0 in this case)
    FPC_ERROR_TEMPLATE_SIZE The size of the data pointer is invalid (passing 0 is only valid for deleting the content of the template handle. In this case the pTemplate pointer must be NULL)
    FPC_ERROR_PARAM_OUT_OF_RANGE Format descriptor does not describe a supported format, this could either be a typo in the string, or the format is not supported, because the license did not include this format
    FPC_ERROR_FORMAT_NOTSUPPORTED the format is not supported, because the license did not include this format, please also check that all *.dpl files are located in the same directory as the dynamic library of the component
    FPC_ERROR_UNKNOWN_CODEC The memory buffer content is not recognized as a valid template of the given format
    FPC_ERROR_TEMPLATE1_BAD The memory buffer content is not recognized as a valid template of the given format or you have tried to set a multiprint template
    Merci à tous

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Le message est clair, la taille passée à la fonction n'est pas bonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             size_t  nTemplateSize=0;
             BYTE *tab = new BYTE[nTemplateSize];
    tu alloues 0 octet, donc il y a chance que tu ne lise pas cgand chose.

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    mala92 m'a grillé, mais je veux rajouter d'autres problèmes à ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(tab, sizeof(BYTE) * nTemplateSize, &nTemplateSize, fichier); // ecriture
    tu fais une écriture alors que le fichier est ouvert en mode readonly "rb". tu t'attendais à quoi ?
    d'ailleurs, au même appel à fwrite, tu passes l'adresse de la taille, et non la taille elle-même.

    Edit : Pour une fois qu'il existe un SDK qui fournit un code d'erreur qui a un sens, avec un message explicite, quel dommage de ne pas le lire.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    En C++, std::vector est à préférer aux allocations de tableaux dynamiques (c'est fait pour).
    Idem pour les fichiers, préférer la gestion des flux (std::fstream).
    Il y a d'ailleurs une erreur dans le code puisque le fichier est ouvert avec "rb" mais on écrit quand même dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        size_t  nTemplateSize=0;
        std::vector<BYTE> tab(nTemplateSize,0);
        std::fstream fichier("C:\\Test.template",std::ios::binary);
        fichier.read(&tab[0],tab.size());
        fichier.seekg(std::ios_base::beg);
        fichier.write(&tab[0],tab.size());
        nRetCode = FC3SetTemplateData(hTemplate1, &tab[0], tab.size(), "ISO/IEC 19794-2:2005");
        if (nRetCode!=FPC_SUCCESS)
        std::cout<<"Error ("<<nRetCode<<") : "<< FC3GetErrorDescriptionA(nRetCode) <<"\n";
        //FC3DestroyHandle((FC3_t *)&hTemplate1);
        // *************** Fin génerer un handle à partir d'un fichier template ************************

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Je vous remercie pour vos réponses si rapides

    mala92: J'ai déjà essayé de changer la taille de nTemplateSize et j'obtiens le message d'erreur FPC_ERROR_TEMPLATE1_BAD The memory buffer content is not recognized as a valid template of the given format or you have tried to set a multiprint template
    Comment puis-je résoudre ce problème svp?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Bonjour 3DArchi;

    Merci pour votre réponse ainsi pour votre conseil, j'ai commencé à chercher quelques tutos pour bien comprendre comment manipuler ces vecteurs ..
    Par contre j'ai voulu exécuté votre code et je reçois ce message d'erreur:

    error C2664: 'std::basic_ostream<_Elem,_Traits>::write' : cannot convert parameter 1 from 'unsigned char *' to 'const char *'
    pouvez-vous m'aider à le résoudre svp ? Merci

  7. #7
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    C'est sur la ligne "fichier.write(&tab[0],tab.size());" ?

    Comme le dit le message tu utilises un type en lieu et places d'un autre.
    Soit tu utilises le type attendu pour ton paramètre, soit tu le cast si tu ne peux faire autrement (avec un const_cast pour l'attribut const par exemple).
    Selso.
    Ingénieur/CdP développement systèmes embarqués &

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    J'arrive pas à résoudre ce problème jusqu'à maintenant. J'ai essayé de travailler avec un vecteur et avec l'exemple de 3DArchi après avoir corriger le message d'erreur, voilà le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::vector<BYTE> tab(nTemplateSize,0);
        std::fstream fichier("C:\\Exemple.template",std::ios::binary);
        fichier.read((char *)&tab,tab.size());
        fichier.seekg(std::ios_base::beg);
        fichier.write((char *)&tab,tab.size());
        nRetCode = FC3SetTemplateData(hTemplate1, &tab[0], tab.size(), "DERMALOG");
        if (nRetCode!=FPC_SUCCESS)
        std::cout<<"Error ("<<nRetCode<<") : "<< FC3GetErrorDescriptionA(nRetCode) <<"\n";
    L’exécution se plante et m'affiche une fenêtre d'erreur (capture d'écran en pièce jointe).
    Je pense qu'elle soit liée au vecteur ! Il n'y a pas un appel de delete par exemple pour libérer le vecteur après l'avoir utiliser?

    Merci encore une fois
    Images attachées Images attachées  

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Ce n'est pas &tab que tu dois caster mais le buffer sous-jascent obtenu avec l'opérateur [].
    Ensuite, le vecteur est de taille zéro. Il faut au préalable calculer la taille des données à lire. A tout hasard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       std::fstream fichier("C:\\Exemple.template",std::ios::binary);
       fichier.seekg (0, std::ios::end);
       std::size_t nTemplateSize = fichier.tellg();
       fichier.seekg (0, std::ios::beg);
       std::vector<BYTE> tab(nTemplateSize,0);
     
       fichier.read(reinterpret_cast<char*>(&tab[0]),tab.size());
       fichier.seekg(std::ios_base::beg);
       fichier.write(reinterpret_cast<char*>(&tab[0]),tab.size());
       nRetCode = FC3SetTemplateData(hTemplate1, &tab[0], tab.size(), "DERMALOG");
       if (nRetCode!=FPC_SUCCESS)
          std::cout<<"Error ("<<nRetCode<<") : "<< FC3GetErrorDescriptionA(nRetCode) <<"\n";
    Mais je ne sais pas quelle est la quantité pertinente à lire au début. De la même façon que je ne comprends pas pourquoi après avoir lu les données, tu les réécris exactement dans le même fichier à l'identique. Je n'en vois pas trop l'intérêt.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 46
    Points : 33
    Points
    33
    Par défaut
    Bonjour à tous,

    Je trouve toujours des problèmes en utilisant les vecteurs surtout que j'ai jamais travaillé avec, donc (pour le moment) je suis de retour au buffer, voilà mon code:
    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
    18
    19
    20
    21
    22
    23
    24
    25
     
    ifstream f ("C:\\Test.template", ios::in | ios::binary);
        if (!f.is_open())
           cout << "Impossible d'ouvrir le fichier en lecture !" << endl;
           else
    			cout << "Le fichier est ouvert ! !" << endl;
         //Calculer la taille du fichier
     	 f.seekg( -1, ios_base::end );
    	 nTemplateSize = f.tellg();
         cout << nTemplateSize << endl;
    	 // Retour au début du fichier
    	 f.seekg (0, ios::beg);
    	 //Allocation de mémoire
    	 BYTE * buffer = new BYTE [nTemplateSize];
    	 //Lire les données
    	 //f.read (buffer,nTemplateSize);
    	 f.read (reinterpret_cast<char*>(&buffer[0]),nTemplateSize);
         f.close(); 
    	 //Ecrire dans le buffer
         //cout.write (buffer,nTemplateSize);
    	 cout.write (reinterpret_cast<char*>(&buffer[0]),nTemplateSize);
    	 nRetCode = FC3SetTemplateData(hTemplate1, (BYTE *)buffer, nTemplateSize, "ISO/IEC 19794-2:2005");
    	if (nRetCode!=FPC_SUCCESS)
    		printf("Error (%d) while getting template data: %s\n", (int)nRetCode, FC3GetErrorDescriptionA(nRetCode));
    	delete[] buffer;
    sauf que je reçois le message d'erreur "Unexpected end of file" dans la pièce jointe !
    Images attachées Images attachées  

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Utiliser std::vector évite tes erreurs avec new[]/delete[].

    Quand à ton problème, je pense qu'il doit être dans la fonction FC3SetTemplateData et dans le traitement du buffer. A quoi ressemble cette fonction FC3SetTemplateData ?

    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
    18
    19
    20
    21
    22
    23
    ifstream f ("C:\\Test.template", ios::in | ios::binary);
        if (!f.is_open())
           cout << "Impossible d'ouvrir le fichier en lecture !" << endl;
           else
    			cout << "Le fichier est ouvert ! !" << endl;
         //Calculer la taille du fichier
     	 f.seekg( -1, ios_base::end );
    	 nTemplateSize = f.tellg();
         cout << nTemplateSize << endl;
    	 // Retour au début du fichier
    	 f.seekg (0, ios::beg);
    	 //Allocation de mémoire
    	 std::vector<BYTE> buffer(nTemplateSize);
    	 //Lire les données
    	 //f.read (buffer,nTemplateSize);
    	 f.read (reinterpret_cast<char*>(&buffer[0]),nTemplateSize);
         f.close(); 
    	 //Ecrire dans le buffer
         //cout.write (buffer,nTemplateSize);
    	 cout.write (reinterpret_cast<char*>(&buffer[0]),nTemplateSize);
    	 nRetCode = FC3SetTemplateData(hTemplate1, (BYTE *)buffer, nTemplateSize, "ISO/IEC 19794-2:2005");
    	if (nRetCode!=FPC_SUCCESS)
    		std::cout<<"Error ("<<nRetCode<<") while getting template data: "<<FC3GetErrorDescriptionA(nRetCode)<<"\n";

Discussions similaires

  1. Allocation de mémoire dynamique et tableaux
    Par Merillym dans le forum Débuter
    Réponses: 10
    Dernier message: 07/10/2009, 19h13
  2. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  3. problème d'allocation de mémoire
    Par kreel dans le forum C
    Réponses: 10
    Dernier message: 28/04/2007, 14h40
  4. [debutant] : Allocation de mémoire dynamique
    Par sam.fet dans le forum Langage
    Réponses: 5
    Dernier message: 15/02/2006, 14h58
  5. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22

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