Sprintf, combien de mémoire à alloué ???

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 10 août 2010 à 17:46
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 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

5 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
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...).
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
23 août 2010 à 07:33
Salut,
vu que tu utilises CharToOem, tu dois être sous visual studio: tu dois pouvoir utiliser _vscprintf.
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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
0

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

Posez votre question
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
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
0
Rejoignez-nous