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

MFC Discussion :

Split et bonne récupération des données


Sujet :

MFC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 139
    Points : 40
    Points
    40
    Par défaut Split et bonne récupération des données
    Bonjour,
    J'utilise un API biometric de mon PPC.
    J'ai un code que j'arrive a faire fonctionner mais je voudrais lui ajouter un attribut.
    En fait ma fonction ci-dessous recupere (a partir d'un fichier .dat) le caracteristique biometric de l'utilisateur.
    J'ai ajouter le nom de l'utilisateur a la fin de la ligne apres des $$$_$$$ et je voudrais donc récuperer la biometrie et le nom associe.
    J'ai donc trouve une fonction split et je l'ai appliqué a ma fonction.
    Ca compile mais je n'arrive plus a m'authentfier ,ca match plus. donc c'est que je ne recupere plus la bonne donnee bimometric.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    DWORD CDKBioAccessDlg::Identify(int Timeout)
    {
       //////////// load stored templates to buffer //////////
       static unsigned char   *pTemplate;
       static BioAPI_BIR_PTR   pBIRarray;
       static BioAPI_BIR_PTR   pBIRptr;
       static int   len = 1024;
       static int   i;
       static int   nTemplates = 0;
       static WCHAR wcMsg[256];
     
       pTemplate = LoadTemplateDB(&nTemplates, BIODATA_PATH);
       if (!pTemplate)
       {
          if (nTemplates == 0)
          {
             wsprintf(wcMsg, _T("Empty DB: %s"), BIODATA_PATH);
             m_Message.SetWindowText(wcMsg);
             return BioAPI_ERRCODE_INTERNAL_ERROR;
          }
          wsprintf(wcMsg, _T("LoadTemplateDB error: nTemplates=%d"), nTemplates);
          m_Message.SetWindowText(wcMsg);
          return BioAPI_ERRCODE_INTERNAL_ERROR;
       }
     
       if (nTemplates == 0)
          {
             wsprintf(wcMsg, _T("Empty DB: %s"), BIODATA_PATH);
             m_Message.SetWindowText(wcMsg);
             return BioAPI_ERRCODE_INTERNAL_ERROR;
          }
     
       wsprintf(wcMsg, _T("%d templates loaded.\r\nPlease, pass your finger..."), nTemplates);
       m_Message.SetWindowText(wcMsg);
     
       pBIRarray = (BioAPI_BIR_PTR)malloc(nTemplates*sizeof(BioAPI_BIR));
       if (!pBIRarray)
       {
          free(pTemplate);
          goto IdentOut;
       }
       for (i=0; i<nTemplates; i++)
       {
          pBIRptr = pBIRarray + i;
    //------ce qui ne marche pas ----->
          pBIRptr->BiometricData = (BioAPI_BIR_BIOMETRIC_DATA_PTR)(split((char *)pTemplate,"$$$_$$$",0)[0] + i*len);
    //avant et ce qui fonctionne ---->  
    pBIRptr->BiometricData = (BioAPI_BIR_BIOMETRIC_DATA_PTR)(pTemplate + i*len);
          pBIRptr->Header.Length = len + sizeof(BioAPI_BIR_HEADER);
       }
     
     
     
    .....
     
     
    //la fonction split
    //Function to split char
    char** split(char* chaine,const char* delim,int vide){
     
        char** tab=NULL;                    //tableau de chaine, tableau resultat
        char *ptr;                     //pointeur sur une partie de
        int sizeStr;                   //taille de la chaine à recupérer
        int sizeTab=0;                 //taille du tableau de chaine
        char* largestring;             //chaine à traiter
     
        int sizeDelim=strlen(delim);   //taille du delimiteur
     
     
        largestring = chaine;          //comme ca on ne modifie pas le pointeur d'origine
                                       //(faut ke je verifie si c bien nécessaire)
     
     
        while( (ptr=strstr(largestring, delim))!=NULL ){
               sizeStr=ptr-largestring;
     
               //si la chaine trouvé n'est pas vide ou si on accepte les chaine vide                   
               if(vide==1 || sizeStr!=0){
                   //on alloue une case en plus au tableau de chaines
                   sizeTab++;
                   tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
     
                   //on alloue la chaine du tableau
                   tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
                   strncpy(tab[sizeTab-1],largestring,sizeStr);
                   tab[sizeTab-1][sizeStr]='\0';
               }
     
               //on decale le pointeur largestring  pour continuer la boucle apres le premier elément traiter
               ptr=ptr+sizeDelim;
               largestring=ptr;
        }
     
        //si la chaine n'est pas vide, on recupere le dernier "morceau"
        if(strlen(largestring)!=0){
               sizeStr=strlen(largestring);
               sizeTab++;
               tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
               tab[sizeTab-1]=(char*) malloc( sizeof(char)*(sizeStr+1) );
               strncpy(tab[sizeTab-1],largestring,sizeStr);
               tab[sizeTab-1][sizeStr]='\0';
        }
        else if(vide==1){ //si on fini sur un delimiteur et si on accepte les mots vides,on ajoute un mot vide
               sizeTab++;
               tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
               tab[sizeTab-1]=(char*) malloc( sizeof(char)*1 );
               tab[sizeTab-1][0]='\0';
     
        }
     
        //on ajoute une case à null pour finir le tableau
        sizeTab++;
        tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
        tab[sizeTab-1]=NULL;
     
        return tab;
    }
    Si quelqu'un a une idee
    Merci beaucoup

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    petite remarque utiliser des malloc/free et goto en C++ c'est pas terrible ...
    sinon jette a oeil a ce split qui utilise des CString :
    http://c.developpez.com/faq/vc/?page...ons#MakeStrtok
    si tu n'utilise pas les MFC tu peux convetir avec la string de la stl .

  3. #3
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 139
    Points : 40
    Points
    40
    Par défaut
    merci, il est a noter que je travaille avec embedded v C++
    la fonction split fonctionne je pense, mais en fait c'est la récupération des datas qui n'est pas bonne. je n'obtient pas la meme valeur avec et sans le split...dasn un cas j'obtient 260120 et dans l'autre 240180 quand je les affiche pour debugger.

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    sous embedded v C++ la CString est disponible ,et pas de probleme pour l'utilisation de new et delete ...
    si c'est pas le split que veux tu que l'on dise ? , au vu du code utilisé pas grand chose.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 139
    Points : 40
    Points
    40
    Par défaut
    dans la fonction split que tu m'as donne j'ai une erreur,
    error C2664: 'int __cdecl CString::Find(unsigned short) const' : cannot convert parameter 1 from 'const char *' to 'unsigned short' a la gine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int nPos=strOrg.Find(szDelimit);
    ?

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui c'est parce que tu es en unicode.
    voila une version UNICODE du code de la faq:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    CString CStringTok(const wchar_t *szToken,const wchar_t *szDelimit,bool &rbEndParse)
    {
       CString strOrg,str,strDelimit;
       static const wchar_t *pszOrg=NULL;
     
       ASSERT(szDelimit!=NULL);
     
       strDelimit=szDelimit;
     
       if(szToken)
       {
           pszOrg=szToken;
           rbEndParse=false;
       }
       if(!pszOrg)
       {
            rbEndParse=true;
            return _T("");
       }
     
       strOrg=pszOrg;
       int nPos=strOrg.Find(szDelimit);
       if(nPos!=-1)
       {
          str=strOrg.Left(nPos);
          pszOrg+=(nPos+strDelimit.GetLength());
       }
       else
       {
          str=strOrg;
          if(str.IsEmpty() && pszOrg) rbEndParse=true;
          pszOrg=NULL;      
       }
       return str;
    }
     
      CString strOrg=_T("aaa,bbb,,ccc");
     
       bool bEndParse;
       CString strWord =CStringTok(strOrg,_T(","),bEndParse);
       while(!bEndParse)
       {
          // Work
          // ..................
           TRACE(_T("\nnWord:%s"),strWord); 
          // Get Next Token
          strWord = CStringTok(NULL,_T(","),bEndParse);
       }
    }

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu fais du C et du C++ en même temps, ce qui n'est pas forcément bon (c'est un euphémisme).
    Tu gères mal tes malloc et realloc en ne testant jamais les retours, de plus pour realloc il faut procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
    realloc peut echouer, donc il faut faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char **tmp (char**) realloc(tab,sizeof(char*)*sizeTab);
    if (tmp == NULL)
    {
      // je suis dans la m****e mais ....
      // tab est toujours valable
    }
    else
      tab = tmp;
    Ta méthode de réallouer chaque fois que tu augmente de 1 les tailles n'est pas très bonne, en général on commence par une valeur raisonnable (ça dépend de ton appli et on augmente d'une certaine valeur à chaque fois, il faut gérer le nombre maxi de lignes alloées et le nombre courant).
    Dernière remarque, sizeof char vaut par défintion 1 donc on peut l'éviter, mais c'est affaire de goût.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    tout ça ne serait rien ,mais il est en UNICODE et utiliser des char * en UNICODE ce n'est vraiment pas terrible.
    d'ou ma suggestion d'utiliser des objets CString ....

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Utiliser des TCHAR règlerait-il le problème ?

Discussions similaires

  1. Récupération des données d'un formulaire
    Par placenargac dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/02/2006, 15h10
  2. récupération des données via une liste déroulante
    Par rahan_dave dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h27
  3. [HTML][FORMULAIRE] Probleme dans la récupération des données
    Par baddounet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 15/08/2005, 18h51
  4. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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