Pointeurs et fonctions [Résolu] - C - Programmation
Marsh Posté le 07-01-2007 à 12:23:58
exhortae a écrit : voilà je suis tjs avec mes problèmes de pointeurs <...> le soucis c'est au niveau de l'allocation mémoire du tableau, quand je la fait en dynamique j'ai n'importe quoi qui sort dans l'affichage |
C'est normal. Ceci :
Project : Forums |
Révèle un problème de conception :
En effet, tu passes une valeur non initialisée à une fonction. Je rappelle qu'en C, les passages de paramètres se font exclusivement par copie de la valeur, et que modifier la valeur d'un paramètre n'affecte pas la valeur initiale.
Si tu veux qu'une fonction modifie la valeur d'une variable, il y a 2 solutions :
- Passer l'adresse de la variable
- Retourner la valeur et la stocker dans la variable.
NOTA : Si ton compilateur de dit rien, c'est qu'il est probablement mal réglé :
http://mapage.noos.fr/emdel/codage.htm#cfg_compilo
Marsh Posté le 08-01-2007 à 18:53:57
exhortae a écrit :
|
Emmanuel a bien résumé la chose, voire peut-être de façon trop sybilline pour un débutant...
En fait, tu passes à "lire_tab" une copie de "t", c'est à dire une copie de ton pointeur. Cette copie est modifiée dans la fonction "lire_tab" et récupère l'adresse allouée puis la copie est effacée une fois la fonction finie et quand tu reviens dans le "main", "t" n'a jamais été modifié (et ne contient certainement pas l'adresse allouée qui a été perdue)
2 solutions
Marsh Posté le 08-01-2007 à 19:58:48
Emmanuel Delahaye a écrit : |
Oui en faite le pointeur que je passais comme paramètre dans la fonction m'a induit en erreur, j'ai pas pensé qu'il fallait passer comme paramètre un pointeur sur un pointeur.
Sve@r a écrit : Emmanuel a bien résumé la chose, voire peut-être de façon trop sybilline pour un débutant...
|
Merci grâce à ça j'ai pu comprendre mon erreur
voilà le programme modifié
Code :
|
si tu pouvais me dire si maintenant il est correct (chez moi il tourne mais je suis pas sur pour la partie du scanf), ça me permettra ensuite d'expliquer ce que j'ai compris pour voir si je ne me trompe pas.
Merci à vous deux
PS : je viens de voir que t'as editer ton post pour ajouter une précision, mais j'avais trouver avant (cherché pendant 5 bonnes minutes quand même )
Marsh Posté le 08-01-2007 à 21:09:50
exhortae a écrit : voilà le programme modifié
|
D'un point de vue "C", tes scanf sont excellents. T'as parfaitement maîtrisé la relation d'égalité entre "&t[i]" et "t + i" qu'on retrouve aussi entre "t[i]" et "*(t + i)".
Cependant, d'un point de vue "humain", utiliser un "scanf" pour faire saisir qqchose à une personne c'est horrible. Car "scanf" sous-entend que l'entrée est formatée alors que ce que tape le type derrière son clavier est tout sauf formaté. Que se passe-t-il si le type tape "azerty" là où on lui demande un nombre ? 1) ton nombre est à 0 et 2) le buffer d'entrée reste chargé avec "azerty" => à la saisie suivante d'une chaîne, c'est "azerty" qui sera utilisé
La meilleure solution utilisable est de tout accepter via fgets() car au-moins ton buffer est toujours clean et ensuite de traiter ton entrée via sscanf().
Exemple: remplacer
int i; |
Par
int i; |
Pour plus de détail, aller voir http://forum.hardware.fr/hfr/Progr [...] 9666_1.htm
Ensuite, étant donné que ton tableau "t" est intrinsèquement lié à "n", tu peux regrouper les deux éléments dans une structure. Tu passes ensuite l'adresse de la structure à la fonction qui peut grâce, à cet unique paramètre, aller taper dans le tableau "t" ou le nombre "n" comme elle a envie.
1) ça t'économise un paramètre
2) ça t'évite de jongler avec les "*t + i" et "*n"
Enfin ne pas oublier de
1) vérifier que le malloc a réussi sinon ce n'est pas la peine de continuer
2) libérer "t" en fin d'utilisation
Marsh Posté le 08-01-2007 à 21:57:26
Pour la saisie on m'a fait la remarque plusieurs fois, le soucis c'est que en cours on utilise les scanf, et le jour ou j'ai essayé d'utiliser les fgets, strtol ... je me suis senti en déphasage par rapport au cours, donc pour l'instant (et malgré moi) j'utilise ce que l'ont fait en cours avec dans l'idée de corriger ces erreurs de saisie pendant les grandes vacances (j'ai déjà achetéle livre de ritchie et kernighan pour y arriver).
pour les structures je note
quand à la vérification de l'allocation et à la liberation, oui c'est un oubli de ma part.
Merci
Marsh Posté le 07-01-2007 à 12:06:22
Bonjour,
voilà je suis tjs avec mes problèmes de pointeurs et là j'en ai un que j'arrive pas à résoudre:
je dois faire une fonction qui lit les élements d'un tableau, avec comme paramètre un nombre maximum d'elements, si le nombre d'éléments saisis est > au nbre d'elements max autorisé la fonction doit me permettre de changer le nombre d'elements saisie (que j'utiliserais ensuite dans le main pour afficher les éléments)
le soucis c'est au niveau de l'allocation mémoire du tableau, quand je la fait en dynamique j'ai n'importe quoi qui sort dans l'affichage
Message édité par exhortae le 11-01-2007 à 18:40:50