Un scanf() qui perturbe mon code

Un scanf() qui perturbe mon code - C - Programmation

Marsh Posté le 19-03-2009 à 16:33:02    

Salut,
 
Il m'arrive un truc assez incompréhensible !
 
J'ai écris un programme qui marche bien. Dans ce programme j'utilise un WaitableTimer. En gros c'est un petit programme qui enchaine les fonctions: CreateWaitableTimer(), SetWaitableTimer(), et WaitForSingleObject().
 
Si dans ce programme, je rajoute au début une variable int short toto. Ca n'a aucune conséquence. Heureusement ! Si après cette déclaration je fais un scanf("%d", &toto), j'ai aucune erreur de compilation mais la condition:
if (WaitForSingleObject(hXXX, INFINITE) != WAIT_OBJECT_0)
est systématiquement fausse alors qu'elle ne l'était jamais avant l'ajout du scanf() ! La variable toto n'est utilisée nul part pourtant !
 
Si j'enlève le short (en gras plus haut), tout rentre dans l'ordre, il n'y a plus de problème.
 
Je suis scié ! Comment expliquer un tel comportement ???


Message édité par cimourdain le 19-03-2009 à 16:34:55
Reply

Marsh Posté le 19-03-2009 à 16:33:02   

Reply

Marsh Posté le 19-03-2009 à 16:38:13    

parce que ton scanf va écrire 4 octets (int) dans une variable qui n'en contient que 2 (short) et il va donc écraser 2 octets à côté


---------------
last.fm
Reply

Marsh Posté le 19-03-2009 à 16:52:45    

D'accord ! Effectivement j'aurais du y penser... Quel formateur pour un short du coup ?
N'y a-t-il pas un moyen de remplacer cette fonction scanf() par quelque chose d'un peu mieux ? (et plus sécurisé).

Reply

Marsh Posté le 19-03-2009 à 17:11:32    

il existe des extensions non standard de scanf pour supporter ca ... Regarde la doc de ton compilateur si tu te fiches de la compatibilité, sinon, ca ne doit pas te coûter grand chose de passer par un int, de toute façon.
 
Ca fait un moment que je ne fais plus de C, donc je laisse le soin à d'autres de proposer mieux que scanf :)


---------------
last.fm
Reply

Marsh Posté le 19-03-2009 à 18:06:30    

%hd je dirais
sinon le diagnostique est correct, c'est bien un problème de taille.
Pourquoi ne pas lire un entier puis le copier dans le short après ?
 

Code :
  1. int i;
  2. short toto;
  3. scanf( "%d", &i );
  4. toto = i;


 
edit:
scanf est complètement sécurisée si tu t'en sers bien. Peu de fonctions C sont non sécurisée, quoi que certains en dise. gets() par exemple.
Va voir là, c'est un exelent tuto pour s'en servir correctement :
http://xrenault.developpez.com/tutoriels/c/scanf/


Message édité par jesus_christ le 19-03-2009 à 18:08:40
Reply

Marsh Posté le 19-03-2009 à 19:28:04    

cimourdain a écrit :

D'accord ! Effectivement j'aurais du y penser... Quel formateur pour un short du coup ?


"%hd"

Citation :

N'y a-t-il pas un moyen de remplacer cette fonction scanf() par quelque chose d'un peu mieux ? (et plus sécurisé).


fgets() + strtol().
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 20-03-2009 à 10:28:44    


 
Ah, tiens, effectivement, je me suis cantonné à relire le tableau du K&R et ils l'ont précisé dans le paragraphe suivant [:petrus75]


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed