exhortae Membre du Cartel des Médecins | Emmanuel Delahaye a écrit :
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.
|
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...
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
- tu passes à ta fonction "lire_tab" l'adresse de "t". Cette fonction recevant une adresse (de type "int **" puisque "t" est de type "int*" ) pourra aller modifier l'élément pointé ("*t=malloc(...)" ) => pour résumer, t'as parfaitement compris que comme "n" sera modifié dans "lire_tab" (lors du "scanf()" ) il faut lui passer l'adresse de "n" dans le "main"; donc tu dois appliquer le même raisonnement pour "t" => tu peux aussi te rappeler que dans "lire_tab()" tu peux nommer tes paramètres avec un nom différent des variables du "main()" et tu réaliseras qu'il n'y a aucun rapport avec le "t" du main() et le "t" de lire_tab()
- tu fais renvoyer par "lire_tab" le pointeur de la zone allouée (renvoyé lui-même par malloc) et, dans ton main, tu écrits "t=lire_tab(...)" => dans ce cas plus la peine de passer "t" à "lire_tab" car il sera modifié par l'affectation de retour
|
Merci grâce à ça j'ai pu comprendre mon erreur
voilà le programme modifié
Code :
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- void lire_tab (int **t1, int *n, int nmax)
- {
- int i;
- while (nmax < *n)
- {
- printf ("Dimension du tableau : " );
- scanf ("%d", n);
- }
- *t1 = (int*) malloc ((*n) * sizeof (int));
- for (i = 0; i < *n; i++)
- {
- printf ("Element[%d] : ", i + 1);
- scanf ("%d", *t1 + i);
- }
- }
- int main (void)
- {
- int *t, n, i;
- printf ("Dimension du tableau : " );
- scanf ("%d", &n);
- lire_tab (&t, &n, 10);
- printf ("\n\n" );
- for (i = 0; i < n; i++)
- printf ("element[%d] : %d\n", i + 1, t[i]);
- getch ();
- return 0;
- }
|
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 ) |