Résolu Probleme de débutant en langage c (pointeur)

Solutions (4)
Tags :
  • Pointer
  • Programme
  • Programmation
|
bonjour,

j'ai commencé a apprendre le langage c il y a peu de temps.
Dans le cadre d'un TP je dois créer une pile FIFO de 5 cellules.

mon problème se situe au niveau de ma fonction adjonction().
je crois qu'elle fonctionne correctement seulement lorsque j'incrémente le pointeur t pour le faire pointer sur la deuxième cellule de mon tableau.
je n'arrive pas a faire sortir la nouvelle adresse pointer par t hors de ma fonction adjonction.

je n'ai pas due tout comprendre sur le cours concernant les pointeur :pt1cable: 

merci pour votre aide ^^

voici mon programme :

#include <stdio.h>
#include <stdlib.h>

menu(int tab[],int*t,int*q);
adjonction(int tab[],int*t);
suppression(int tab[],int*q);
lister(int tab[],int*t,int*q);

int main()
{
int tab[5]={0,0,0,0,0},*t,*q;
t=&tab[0];
q=&tab[0];

while (1)
{
menu(tab,t,q);
}
return 0;
}

menu (int tab[],int*t,int*q)
{
int choix;
printf("\n Faite votre choix :\n");
printf("\n 1. Adjonction\n\n 2. Suppression\n\n 3. Lister\n\n");
scanf("%i",&choix);

switch (choix)
{
case 1 : adjonction(tab,t);
break;

case 2 : suppression(tab,q);
break;

case 3 : lister(tab,t,q);
break;

default : printf("\n saisie incorrecte");
}
}

adjonction(int tab[],int*t)
{
int nombre=30;

if (*t != 0)
{
printf("\n Adjonction impossible (file pleine) : la file est inchangee.\n\n");
}
else
{
printf("\n saisissez le nombre a placer dans la pile\n\n");
scanf("%i",nombre);

*t=nombre;

if (t == &tab[4])
t = &tab[0];

t++;
}
}

suppression(int tab[],int*q)
{
if (*q == 0)
{
printf("\n Suppression impossible (file vide)\n\n");
}
else
{

*q=0;

if (q == &tab[4])
q = &tab[0];

q=q+1;
}
}

lister(int tab[],int*t,int*q)
{
printf("\n tab[0] = %d adresse : %X\n tab[1] = %d adresse : %X\n tab[2] = %d adresse : %X\n tab[3] = %d adresse : %X\n tab[4] = %d adresse : %X\n\n",tab[0],&tab[0],tab[1],&tab[1],tab[2],&tab[2],tab[3],&tab[3],tab[4],&tab[4]);
printf("\n t = %d adresse pointee : %X\n q = %d adresse pointee : %X\n\n",*t,t,*q,q);
}
Contenus similaires
Meilleure solution
partage
|
Oui, c'est l'erreur classique de la modification d'une valeur d'un paramètre.

Je vais tenter une explication sans parler de pile d'appel pour éviter de t'embrouiller avec une autre pile. :D 

En C, tous les paramètres de fonctions sont passés par copie
donc, quand tu fais "void foo(int par)", la valeur "par" n'est qu'une copie de ce qui est envoyé par la fonction appelante. Donc, si on modifie par dans la fonction, on va modifier la copie et pas la valeur originale. J'imagine que tu as déjà vu ce problème.

Et bien c'est la même chose avec les pointeurs. Quand tu fais "void foo2(int * ptr)", ptr est une adresse mémoire, et cette adresse mémoire est aussi copiée.
Par exemple, si je fais: "int a=10; int * p=&a; foo2(p);", si je suppose que l'adresse de "a" est 0x00400000, alors, c'est une copie de l'adresse 0x00400000 qui est utilisée dans la fonction foo2.
Si dans la fonction, tu fais "*ptr = 11;", tu vas mettre 11 en mémoire à l'adresse 0x00400000, donc tu vas modifier le contenu de "a".
Par contre, si tu fais dans ta fonction "ptr++;", tu modifies l'adresse mémoire, pas le contenu, du coup, la copie du pointeur aura la valeur 0x00400004, mais "p" sera toujours à 0x00400000 puisque tu ne modifie que la copie du pointeur.

Donc, si tu veux pouvoir modifier ton pointeur (la valeur de l'adresse mémoire), il faut faire comme la passage de foo à foo2 : faire un passage par pointeur pour modifier un contenu de pointeur.
Dans l'exemple précédent, si le veut pouvoir modifier "p", il me faut un pointeur "pp" (par exemple d'adresse 0x00400100) qui pointera sur le pointeur "p" (d'adresse 0x00400000), du coup, dans ta fonction, tu pourras modifier la valeur du pointeur 0x00400000 situé en dehors de la fonction:
  1. void foo3(int ** p)
  2. {
  3. if( !p || !(*p) )
  4. return;
  5.  
  6. // Modif de valeur: **p = ...
  7. // Modif du pointeur(attention aux priorités des opérateurs): (*p)++
  8. }

  1. int a = 10;
  2. int * p = &a;
  3. foo3( &p ); // Après appel, le pointeur p peut ne plus pointeur sur a


J'avais répondu à des question similaires ici:
http://www.infos-du-net.com/forum/270963-21-pointeurs-structures-etudiants-guerre
  • Commenter cette solution |
Score
0
òh
òi
|
OK d'accord, bon eh ben j'ai plus qu'à ^^

merci pour la rapidité et la précision de ta réponse.
  • Commenter cette réponse |
Score
0
òh
òi
|
oups désolé c'est la première fois ^^

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. menu(int tab[],int*t,int*q);
  5. adjonction(int tab[],int*t);
  6. suppression(int tab[],int*q);
  7. lister(int tab[],int*t,int*q);
  8.  
  9.  
  10.  
  11. int main()
  12. {
  13. int tab[5]={0,0,0,0,0},*t,*q;
  14. t=&tab[0];
  15. q=&tab[0];
  16.  
  17. while (1)
  18. {
  19. menu(tab,t,q);
  20. }
  21. return 0;
  22. }
  23.  
  24. menu (int tab[],int*t,int*q)
  25. {
  26. int choix;
  27. printf("\n Faite votre choix :\n");
  28. printf("\n 1. Adjonction\n\n 2. Suppression\n\n 3. Lister\n\n");
  29. scanf("%i",&choix);
  30.  
  31. switch (choix)
  32. {
  33. case 1 : adjonction(tab,t);
  34. break;
  35.  
  36. case 2 : suppression(tab,q);
  37. break;
  38.  
  39. case 3 : lister(tab,t,q);
  40. break;
  41.  
  42. default : printf("\n saisie incorrecte");
  43. }
  44. }
  45.  
  46. adjonction(int tab[],int*t)
  47. {
  48. int nombre=30;
  49.  
  50. if (*t != 0)
  51. {
  52. printf("\n Adjonction impossible (file pleine) : la file est inchangee.\n\n");
  53. }
  54. else
  55. {
  56. printf("\n saisissez le nombre a placer dans la pile\n\n");
  57. scanf("%i",nombre);
  58.  
  59. *t=nombre;
  60.  
  61. if (t == &tab[4])
  62. t = &tab[0];
  63.  
  64. t++;
  65. }
  66. }
  67.  
  68. suppression(int tab[],int*q)
  69. {
  70. if (*q == 0)
  71. {
  72. printf("\n Suppression impossible (file vide)\n\n");
  73. }
  74. else
  75. {
  76.  
  77. *q=0;
  78.  
  79. if (q == &tab[4])
  80. q = &tab[0];
  81.  
  82. q=q+1;
  83. }
  84. }
  85.  
  86. lister(int tab[],int*t,int*q)
  87. {
  88. printf("\n tab[0] = %d adresse : %X\n tab[1] = %d adresse : %X\n tab[2] = %d adresse : %X\n tab[3] = %d adresse : %X\n tab[4] = %d adresse : %X\n\n",tab[0],&tab[0],tab[1],&tab[1],tab[2],&tab[2],tab[3],&tab[3],tab[4],&tab[4]);
  89. printf("\n t = %d adresse pointee : %X\n q = %d adresse pointee : %X\n\n",*t,t,*q,q);
  90. }


  • Commenter cette réponse |
Score
0
òh
òi
|
C'est pas lisible, alors je lis pas.
Utilise les tags [ cpp ] [ /cpp ] pour afficher le code.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS