Je suis actuellement entrain de coder un programme en langage C permettant d'intéragir avec un lecteur RFID Skyetek M9. Skyetek fournit une API qui ma fois ne fonctionne pas trop mal hormis un petit détail. En effet, les tableaux de caractères contenu à l'intérieur des structures sont remplis à l'aide de caractères et de '\0' qui sortent de nul part. Supposons que j'ai un pointeur sur structure, cette structure contient un tableau nommé nom de 128 caractères. Ce tableau contient alors les données suivantes : {'S', '\0', 'k', '\0', 'y', '\0', etc...}Ce qui fait que lorsque je fais un printf du genre printf("Nom : %s", ptr->nom) et bien il ne m'affiche que le 'S', ce qui est normal puisqu'une fin de chaine est détectée après ce premier caractère. Ma question est, à quoi cela pourrait t'il être du? Je développe à l'aide de Dev C++ sur un environnement Windows.
Bien sur je pourrais contourner le problème en écrivant une fonction qui me réorganise le tableau bien correctement, mais travaillant sur un système embarqué, je n'ai pas des ressources processeurs illimités.
Toute piste de réflexion est la bienvenue.
Par avance merci,
A voir également:
Un tableau qui se remplit avec des'\0' entre chaque caractère ?
Si l'API fournie est en UNICODE, il faut faire un programme UNICODE ! Ca sera plus simple que de convertir d'un format à l'autre. Mais peut être y-a-t'il une version ASCII de cette API ?
Le compilateur (le préprocesseur en fait) n'a aucune raison de refuser un #define ASCII mais c'est pas pour ça que cela sera pris en compte ! La constante ASCII sera créée tout simplement ! A ma connaissance il faut mettre #define UNICODE pour passer en UNICODE, si on ne le met pas on reste en ASCII, c'est comme cela que je l'utilise.
Pouvez-vous poster l'exemple qui est fourni avec l'API (ou un extrait avec la structure) ?
Jean-François
//
// FUNCTION: SelectLoopCallback(LPSKYETEK_TAG, void *)
//
// PURPOSE: Callback called by SkyeTek_SelectTags whenever
// a tag is selected. This returns 1 to continue
// and zero to stop.
//
//
unsigned char SelectLoopCallback(LPSKYETEK_TAG lpTag, void *user)
{
if( !isStop )
{
if( lpTag != NULL )
{
printf("Tag: %s; Type: %s\n", lpTag->friendly, SkyeTek_GetTagTypeNameFromType(lpTag->type));
SkyeTek_FreeTag(lpTag);
}
}
return( !isStop );
}
//
// FUNCTION: ThreadProc(LPVOID)
//
// PURPOSE: Main thread function. It sits in a loop until the
// reader is discovered and then it calls the
// SkyeTek_SelectTags function, which does not return
// until the loop stops. To stop the loop, the
// SelectLoopCallback needs to return zero.
//
//
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
LPSKYETEK_DEVICE *devices = NULL;
LPSKYETEK_READER *readers = NULL;
SKYETEK_STATUS st;
unsigned int numDevices;
unsigned int numReaders;
// comment this out to disable debug
SkyeTek_SetDebugger(debug);
// set reader info
printf("Found reader: %s\n", readers[0]->friendly);
// the SkyeTek_SelectTags function does not return until the loop is done
printf("Entering select loop...\n");
st = SkyeTek_SelectTags(readers[0],AUTO_DETECT,SelectLoopCallback,0,1,NULL);
if( st != SKYETEK_SUCCESS )
printf("Select loop failed\n");
printf("Select loop done\n");
Par contre la structure SKYETEK_READER est compatible UNICODE avec ces TCHAR !
Tout cela donne vraiment à penser que l'API est compilée en mode UNICODE, vu ce qu'elle retourne dans la structure readers. En ajoutant le #define UNICODE tout au début ça ne change rien ?
En cherchant des infos sur Google je tombe sur un autre post ici qui parle du même programme mais pas de ce problème ! Peut-être pourra-t'il donner des infos sur sa façon de compiler ?
Pour compiler en unicode, il faut definir UNICODE et _UNICODE, et si
possible c'est quand même mieux de faire ca dans les options du compilo
plutot que dans le code, comme ça, aucun probleme et tu ne te
retrouvera pas avec un cpp compilé en ansi et un en unicode.
A noter qu'il existe aussi plein de macro pratiques pour faire un code
qui compile en unicode ou en ansi au choix: TCHAR, TEXT, LPTSTR,
_tcslen, etc.
Alors la j'avoue que je suis bluffé, ça marche niquel. Un grand merci ! Donc si j'ai bien compris cette fonction permet d' encoder une chaine UNICODE en ASCII? Il faudrait donc que je compile en ASCII ? Je suis entrain de regarder comment passer ca en option au compilateur