|
Bas de page | |
---|---|
Auteur | Sujet : Problème return char. |
Publicité | Posté le 27-03-2011 à 11:44:33 |
Elmoricq Modérateur | 1. C'est très simple : 2. Un pointeur, c'est bêtement une adresse mémoire à partir de laquelle débute un stockage. Si l'on regarde ton code, on voit un autre souci : il n'y a pas de zone mémoire allouée au moment d'utiliser scanf. Ta variable *mot étant non-initialisée, elle contient soit NULL soit une valeur aléatoire, en fonction du mode de compilation (debug ou release). Donc au moment de saisir un mot, le programme va essayer de stocker soit vers NULL (segmentation violation) soit vers une adresse aléatoire (non valide et donc re-segfault ou, pire, valide). 3. Autre chose : en C, inutile de caster void*, donc pas besoin de caster le retour de malloc.
4. Enfin, dernière chose : utilise fgets plutôt que scanf, beaucoup plus facile à utiliser. La fonction scanf n'est pas une fonction simple à utiliser correctement. Message édité par Elmoricq le 27-03-2011 à 12:05:03 |
Pikar | Merci de ta réponse rapide, je pense avoir compris quelques notions grâce à toi.
|
Elmoricq Modérateur |
|
Pikar | Oui, je vois ce que tu veux dire. Mais pour l'instant chacun de mes tests marchaient et je pensais que le malloc pouvait calculer l'espace à allouer en fonction du nombre de caractères que l'on rentrait. Le mieux serait d'allouer de l'espace en fonction du nombre de caractères rentrés, sinon je ne vois pas à quoi sert le malloc si on est obligé de rentrer un nombre n fixe. Autant faire un
en ajoutant à la fin de la saisie un zéro terminal. Peut-être qu'avec un tampon cela marcherait. EDIT : Finalement, j'ai alloué 25+1 caractères, étant donné que mon sujet de TP consiste à rentrer un mot et à le classer dans un arbre binaire, j'ai pris le nombre de caractères maximum par rapport au mot le long de la langue française. Message cité 1 fois Message édité par Pikar le 27-03-2011 à 13:45:41 |
Elmoricq Modérateur |
Et non. La lecture de chaîne dynamique n'est pas très dure à faire en C, mais c'est toujours un peu lourdingue : il faut passer par de la mémoire dynamiquement allouée, et tu agrandis la zone au fur et à mesure de la lecture si le tampon est trop petit, en contrôlant le nombre de caractères lus : en gros tu lis soit jusqu'au prochain saut de ligne en 1 fois (tampon OK), soit jusqu'à ce que le tampon soit plein, auquel cas tu agrandis l'espace de stockage et tu poursuis la lecture. Rinse & repeat. Mais pour débuter, le plus simple est de passer par de la mémoire dynamiquement allouée avant lecture avec une centaine de caractères. Pour un mot ce devrait être largement suffisant. Ça n'a pas grand intérêt je te l'accorde, sauf pour s'entraîner à utiliser ces mécaniques correctement.
Message édité par Elmoricq le 27-03-2011 à 14:22:32 |
h3bus Troll Inside |
Attention si tu déclares dans ta fonction un char mot[26], lorsque tu quitte la fonction mot n'est plus un espace réservé et sera certainement écrasé plus tard. L'idée ici serait de déclarer dans la fonction un char mot[26] par exemple si tu sais que 25 est la taille maximale du mot à saisir. Ensuite après ton fgets tu peut faire un malloc d'un second buffer de la taille exacte de ton mot: strlen(mot) + 1 (ceci pour économiser un peu de mémoire), tu fait ensuite un strncpy dans ton nouveau buffer que ta fonction retourne à l'appelant. Message édité par h3bus le 27-03-2011 à 19:56:37 --------------- sheep++ |
Sujets relatifs | |
---|---|
Problème(s) positionnement div | [RESOLU] Problème compilation Visual C++ |
[RESOLU] problème requete SQL 2008 | [CSS] Problème d'affichage! |
Problème de libération (free()) | Vba: Excel >Word , Probleme de decimales |
Probleme bioinfo melant l'informatique | Problème Validation XML - Ordre Aléatoire |
Problème avec la fonction setrlimit | problème de liaison d'un objet distant |
Plus de sujets relatifs à : Problème return char. |