Un tableau qui se remplit avec des'\0' entre chaque caractère ?

Résolu
Vinalys21 Messages postés 17 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 11 avril 2008 - 9 avril 2008 à 10:01
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 11 avril 2008 à 16:13
Bonjour à tous,

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,

33 réponses

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
10 avril 2008 à 14:29
Ah! ça se précise !


WideCharToMultiByte() permet de convertir une chaîne UNICODE (que l'on trouve souvent sous le nom de "wide characters" : caractères larges ! ils sont sur 2 octets) vers une chaîne ASCII entre autres (CP_ACP = page de codes ASCII). Et il existe la fonction MultiByteToWideChar() qui fait le contraire !

"Il faudrait donc que je compile en ASCII" : Non ! visiblement l'API est en version UNICODE donc il faut que le programme utilisateur soit aussi compilé en UNICODE (après l'avoir adapté en UNICODE, c'est à dire prendre la version UNICODE des fonctions qui manipulent des chaînes de caractères, et déclarer les chaines en UNICODE). Il est possible de rester en ASCII (la preuve après le test !) mais il va falloir convertir toutes les chaînes, y compris vers UNICODE s'il y en a à passer à l'API).

Jean-François
0
Vinalys21 Messages postés 17 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 11 avril 2008
10 avril 2008 à 15:32
Bon faut que je trouve comment compiler en UNICODE alors. Par contre toutes les chaines sont déclarées dans l'API et les fonctions qui les manipulent aussi. Visiblement ça a bien l'air d'être de l'unicode
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
10 avril 2008 à 15:49
Autre test à faire, sans conversion spéciale :

1) Ajouter la déclaration UNICODE au début.
2) Utiliser la version UNICODE de printf().

#define UNICODE
#include "stdafx.h"
#include "SkyeTekAPI.h"
#include "SkyeTekProtocol.h"

...

  // set reader info
  wprintf("Found reader: %s\n", readers[0]->friendly);

Ca donne quoi ?

Jean-François
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
10 avril 2008 à 15:52
Oubli (la chaîne constante doit être en UNICODE aussi !) :




// set reader info

w
printf(L"Found reader: %s\n", readers[0]->friendly);



 

Jean-François
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vinalys21 Messages postés 17 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 11 avril 2008
10 avril 2008 à 16:03
Ca marche parfaitement en utilisant cette fonction !
0
Vinalys21 Messages postés 17 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 11 avril 2008
10 avril 2008 à 16:10
Si j'écris tout mon prog utilisateur en utilisant wprintf, je risque pas d'avoir des problèmes de portabilité après?
0
Vinalys21 Messages postés 17 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 11 avril 2008
10 avril 2008 à 16:14
Je viens de vérifier, je développe pour une cible à base d'ARM7 et elle n'implémente pas la fonction wprintf...
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
10 avril 2008 à 16:17
Si elle ne comprend pas wprintf() elle risque de ne pas comprendre l'API en UNICODE !
Jean-François
0
Vinalys21 Messages postés 17 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 11 avril 2008
10 avril 2008 à 16:34
Heu ca serait assez problématique tout ca... Le problème c'est que je ne peux pas encore vérifier sur la cible si tout fonctionne
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
10 avril 2008 à 16:39
Il faudrait vérifier s'il n'existe pas une version ASCII de cette API. Le programme donné en exemple le laisse penser.

Jean-François
0
Vinalys21 Messages postés 17 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 11 avril 2008
11 avril 2008 à 08:50
Je vais me renseigner et je post des que j'ai du nouveau. En tout cas mille mercis pour ton aide plus que précieuse.
0
Vinalys21 Messages postés 17 Date d'inscription jeudi 22 novembre 2007 Statut Membre Dernière intervention 11 avril 2008
11 avril 2008 à 16:00
Bon visiblement l'API n'existe pas en version ASCII. C'est pas bien grave, je pense que je vais implémenter une fonction de conversion sur la cible ARM et ca sera réglé.

Encore merci pour l'aide!
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
11 avril 2008 à 16:13
Oui en effet, 2 petites fonctions de conversion pour envoyer en UNICODE à l'API et repasser en ASCII ce qui vient de l'API ! Bonne écriture et bon tests.

Jean-François
0
Rejoignez-nous