begin process at 2012 05 30 11:28:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Shell

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mardi 10 août 2010 à 17:46:34 | sprintf, combien de mémoire à alloué ???

Polack77

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) :
Code C/C++ :
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 :

Code C/C++ :
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
jeudi 19 août 2010 à 14:22:02 | Re : sprintf, combien de mémoire à alloué ???

rt15

Membre Club Administrateur CodeS-SourceS
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...).

vendredi 20 août 2010 à 11:13:55 | Re : sprintf, combien de mémoire à alloué ???

Polack77

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
lundi 23 août 2010 à 07:33:30 | Re : sprintf, combien de mémoire à alloué ???

aardman

Membre Club
Salut,
vu que tu utilises CharToOem, tu dois être sous visual studio: tu dois pouvoir utiliser _vscprintf.
lundi 30 août 2010 à 14:26:26 | Re : sprintf, combien de mémoire à alloué ???

Polack77

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
mercredi 1 septembre 2010 à 11:05:11 | Re : sprintf, combien de mémoire à alloué ???

Polack77

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


Cette discussion est classée dans : message, format, liste, char, oem


Répondre à ce message

Sujets en rapport avec ce message

Trie liste de saisit sans passer par une insertion [ par Nexouille ] Voila je dois a partir d'un fichier prendre toute les ip qui s'y trouve dont on ne connait pas le nombre et je dois compter combien de fois elles appa PROBLEME NETSEND [ par zzzzzz ] En fait j'essaye d'envoyer un message par la fonction net send via internet a ordi qui posssede xp. Si je mjet mon ip ca marche et si je met l'ip de q va_list [ par garslouche ] Salut à tous,je voudrais faire un truc idiot mais c juste pour un test : je voudrais faire une fonction myprintf qui fasse comme printf (en utilisant conversion int en char* [ par arwenita ] Encore un petit problème en C++...Dans mon programme, je voudrais afficher une liste de nombres (premiers), que je récupère de la fonction Crible(n).L [c] erreur malloc (incompatible types in assignment) [ par Diony ] voici mon programme : #include #include #include typedef struct recette { char * nom; struct ingredient * ing; [c] pour les motivés ,structurer un fichier [ par Diony ] bonjour , voici mon programme . je n arrive pas a structurer mon fichier a cause de la fonction inserer_recette_fin_liste qui doit normalement inserer Thread et variable globale [ par valoue ] Bonjour,Je developpe une application en C++.La classe que je developpe comporte une méthode "recevoir (char *trame). Dans cette méthode, je fais appel Conversion str en char [ par bthivent ] Bonjour !J'aimerai en faite faire une message box : MessageBox(NULL, message, "Connexion", MB_YESNO) avec dedans une message spéciale...je sais que ma Truc de fou : Pointeurs qui ne comprennent pas les cases vides [ par toddis ] Bonjour,Voilà je suis en train de faire un driver modbus et pour cela j'ai crée une fonction qui calcule le lrc ( controle de validité du message).Le [Débutant]Surcharge opérateur + [ par Geolem ] Bonjour tout le monde ! Je n'arrive pas à surcharger mon opérateur +... En faite, il faudrait que j'applique l'opérateur + à un objet de Message et à


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales