Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
10 août 2010 à 17:46
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
1 sept. 2010 à 11:05
Bonjour,
J'ai un petit
problème dans une fonction toute bête (et sa commence à me courir sérieusement).
Je veut construire une fonction myprintf qui exécute "CharToOem" puis affiche le message (je suis en train de faire évoluer un GROS et VIEUX programme qui n'affiche pas les caractères accentués correctement. Je me suis donc dit "Le plus simple c'est que je remplace printf par myprintf fait maison" (j'ai pas forcément raison si quelqu'un connais mieux je suis preneur ))
Voila mon myprintf en l'état (et sa fonctionne) :
int myprintf(const char * format, ...)
{
char OEM_Message[2048];
int LngMessage;
va_list liste;
va_start(liste, format);
LngMessage = vsprintf(OEM_Message,format ,liste);
CharToOem(OEM_Message,OEM_Message);
printf(OEM_Message);
va_end(liste);
return LngMessage;
}
Problème :
J'utilise 2ko de mémoire à chaque fois (bon pas longtemps mais j'aime que mes codes soit correctement optimisé)
Je préférerais alloué exactement la mémoire qui m'est nécessaire. Soit un truc du genre :
int myprintf(const char * format, ...)
{
char* OEM_Message;
int LngMessage;
va_list liste;
va_start(liste, format);
OEM_Message = (char*)malloc(sizeof(char)*TailleDeMaChaine +1);
LngMessage = vsprintf(OEM_Message,format ,liste);
CharToOem(OEM_Message,OEM_Message);
printf(OEM_Message);
va_end(liste);
free(OEM_Message);
return LngMessage;
}
Sauf que je n'arrive pas à trouver de fonction qui sache me trouver la valeur "TailleDeMaChaine" sauf vsprintf qui ne peut fonctionner que si le 1èr paramètre est OK (NULL ou 0 ne fonctionne pas).
Donc pour avoir TailleDeMaChaine il me faut vsprintf et pour faire fonctionné comme je le veut vsprintf il me faut TailleDeMaChaine
Qq'un aurais une idée ?
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 19 août 2010 à 14:22
Salut,
Bienvenue dans la runtime C !
Franchement, c'est est une usine à faire des bugs, des failles et des problèmes de portabilité...
Il se trouve que *printf dispose en standart d'un spécifieur n, qui indique le nombre de caractères écrit jusque là.
Le problème est qu'il faut quand même passer une chaîne tampon (Encore que ça dépend de l'implémentation !)...
Tu as aussi des utilisations foireuses de snprintf (Plusieurs appel, passage de NULL...)
Le problème est que le comportement varie d'un compilo à l'autre, voire d'une version de compilo à l'autre...
Peut être que buffer -> NULL, et count -> 0 fonctionnerait sur VC > 6 (Ne fonctionne pas en 6).
Autre méthode, faire des realloc jusqu'à ce que la taille soit suffisante, exemple glibc ici...
Il y a aussi asprintf qui fait lui même le malloc, mais très rarement dispo (Hors linux).
Sans parler de StringCbPrintfEx, sprintf_s...
Franchement, à côté de tout ça, les 2ko réservé sur la pile c'est vraiment du détail et ne devrait pas poser de problème de consommation mémoire en regard du reste (Et c'est bien mieux niveau perf).
Le seul risque étant que 2ko, ça ne suffise pas (Donc vaut mieux utiliser snprintf ou sprintf_s pour parer au plantage, même si ça n'empêchera pas l'utilisateur d'avoir une chaîne tronquée...).
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 20 août 2010 à 11:13
Oui le GROS risque c'est que les 2ko ne soit pas suffisant (même si un printf de plus de 2048 caractères sa se voie pas tout les jours )
Mon compilo ne connais ni snprintf, ni asprintf, ni sprintf_s, ni même StringCbPrintfEx , en faite il connais rien (vive VS6 )
Mais oui l'idéale serais de tronquer l'affichage si celui-ci fait plus de 2048 caractères, il me reste à trouvé comment faire.
Car si jamais mon message est plus long que mon buffer bà paf boum et patatra :
Unhandled exception in Monprog.exe: 0xC0000005 "Access Violation."
Alors que CharToOem me retourne true
PS :
L'option du realloc semble fonctionner mais j'ai quand même un problème de conscience avec :
Pour tester si j'ai besoin de plus de mémoire il faut que je soit déjà passé par vsprintf. Donc j'ai déjà fait un dépassement mémoire et foutu la mémerde quelque part sans pouvoir savoir où . Donc même si cette solution semble plutôt pas mal sa ne me conviens pas
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 30 août 2010 à 14:26
Je suis dans visual studio 6 et il semble qu'il ne connais pas cette fonction
Bon je pense que sa doit être jouable que je faire une mise à jour de stdio.h (et .lib )
Je poste ma fonction une fois terminé (et le lient ou récup la mise à jour de stdio )
Merci à vous deux
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Vous n’avez pas trouvé la réponse que vous recherchez ?
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 1 sept. 2010 à 11:05
Je doit mettre ce projet en pause car d'autre choses plus urgente à faire je reviendrais sur ce sujet dé que possible
Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo