Pointeur en paramètre en c

Résolu/Fermé
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011
- 27 oct. 2010 à 13:13
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011
- 27 oct. 2010 à 17:51
Bonjour à tous,
voici mon problème. J'ai une fonction dans laquelle j'utilise un pointeur et je voudrais utiliser la valeur de ce pointeur dans une autre fonction mais je ne sais pas comment faire.
Quelqu'un saurait-il comment faire?

Merci d'avance



12 réponses

ydurce
Messages postés
78
Date d'inscription
samedi 9 octobre 2010
Statut
Membre
Dernière intervention
12 décembre 2010
18
Modifié par ydurce le 27/10/2010 à 13:54
pour passer un pointeur que l'on veut pouvoir modifier, il faut passer un pointeur sur le pointeur:
par ex:
void pass_ptr(int **ptr){int *b=malloc(sizeof(int));*b=5; *ptr=b;}

à l'appel, on aura:
int a=4;
int *ptr=&a;
printf("%d",*ptr);--------> 4
pass_ptr(&ptr); /*passage du pointeur sur le pointeur de a*/
printf("%d",*ptr);--------> 5
/* a n'est plus pointé par ptr, c'est b qui l'est */

si on ne souhaite pas modifier le pointeur, on le passe directement:

void pass_ptr(int *ptr){*ptr=6; ptr=NULL;/* sans effet en dehors de la fonction */ }

à l'appel, on aura:
int a=4;
int *ptr=&a;
printf("%d",*ptr);--------> 4
pass_ptr(ptr); /*passage du pointeur de a*/
printf("%d",*ptr);--------> 6
/* a est toujours pointé par ptr */


cdlt
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 14:02
merci d'avoir répondu ydurce.
Je n'ai pas vraiment compris ce que tu as écris.
Le pointeur que je veux renvoyer est utilisé dans une fonction. C'est un pointeur que je veux réutiliser dans une autre fonction directement sans passer par le main(). Je veux réutiliser la valeur sur laquelle pointe le pointeur.

Est-ce que cela correspond à ce que tu as écris ?
0
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2010 à 14:40
met ce que tu as écris, on y verra plus clair. En fait, je ne comprends pas où est ton problème et ce que tu cherches à faire au final.
0
Nabla's
Messages postés
18143
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 218
27 oct. 2010 à 14:45
De ce que je comprend, il a le main qui appelle deux fonctions, et il voudrait faire dialoguer les fonctions sans faire repasser certaiens valeurs par le main ....

honnetement, en C, a première vue, je ne vois que les déclarations globales.... donc c'est sale.
En C++, on pourrait passer par un pointeur statique dans une classe, mais pas sur que ce soit élégant....

en voyant le code, on pourra surement trouver quelque chose d'un peu plus propre
0
ydurce
Messages postés
78
Date d'inscription
samedi 9 octobre 2010
Statut
Membre
Dernière intervention
12 décembre 2010
18
27 oct. 2010 à 14:50
char sniper a raison, envoies nous ce que tu as fait,.
sinon on parle dans le vide
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

Modifié par ghosta le 27/10/2010 à 16:50
C'est bien Nabla's.
La fonction est une fonction qui ne sert que d'exemple pour ce que je veux faire.


  #include<stdio.h>     
  #include<stdlib.h>     
 #include<Windows.h>     
 #define N 8     
 #define M 8     

int initialiser_tab_1(int tab[][M]);     
int afficher(int tab[][M]);     
int *selectionner(int tab[][M]);          

int main()     
{     
       int tab[N][M];     
       int l=0,c=0,p1=0,p2;     
       printf("\n");     
       initialiser_tab_1(tab);     
      afficher(tab);     
      *selectionner(tab);      
      printf("\n\n\n");     
      system("pause");     
      return 0;     
}     


int initialiser_tab_1(int tab[][M])     
{     
   int l=0,c=0;     
   for(l=0;l<N;l++)     
      {     
        if(l<3)     
         {     
           for(c=0;c<M;c++)     
           {     
             if((l+c)%2==0)     
                 {     
                   tab[l][c]=0;        
                 }     

       else     
            {     
             tab[l][c]=1;     
             }     
   }     
   }     

   else if(l>=3 && l<=4)     
        {     
           for(c=0;c<M;c++)     
          {     
           tab[l][c]=0;     
           }     
       }     
        
   else     
   {     
      for(c=0;c<M;c++)     
         {     
           if((c+l)%2==0)     
                {     
                  tab[l][c]=0;     
                }     
          else     
               {     
                tab[l][c]=2;     
               }     
      }     
   }     
  }     
  return 0;     
}     
      

int afficher(int tab[][M])     
{     
 int l,c;     
      for(l = 0; l<8; l++)     
          {     
           printf("\n\t\t\t\t");     
           for(c = 0; c<8; c++)     
               {     
                 printf("%d", tab[l][c]);     
                 }     
        printf("\n");     
    }     
    return 0;     
}     

int *selectionner(int tab[][M])     
{     
 int l1=0,c1=0,*p1;     
 p1=&tab[l1][c1];     
 do     
 {       
    printf("\nEntrez la ligne du pion a deplacer\t");     
    scanf("%d",&l1);     
    printf("Entrez la colonne du pion a deplacer\t");     
    scanf("%d",&c1);     
    printf("\n");     
   }     
  while(l1>10 || c1>10);     
       
  if(tab[l1][c1]==1)     
    {     
      p1=&tab[l1][c1];     
      printf("%d\n",*p1);      
        
  }     
  else     
   {     
      selectionner(tab);     
      printf("pion a deplacer:%d\n",tab[1][c1]);     
   }     
 return &tab[l1][c1];     
}     


0
Nabla's
Messages postés
18143
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 218
27 oct. 2010 à 15:09
sans te commander, tu veux bien éditer ton message, utiliser la balise < code > (a droite du souligner), et indenter ton code ? c'est plus agréable à lire ...
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 15:29
Voila
0
Nabla's
Messages postés
18143
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 218
27 oct. 2010 à 15:36
y a encore un peu de travail sur l'indetation a faire.. mais plus irgent: c'est quoi exactement que tu veux faire passer de où à où ?
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 15:46
je veux réutiliser tab[l1][c1] qui est dans la fonction selectionner dans une autre fonction. J'ai essayé avec un pointeur je n'ai pas réussi et après j'ai essayé avec un pointeur sur pointeur et je n'ai pas réussi.
je voudrais savoir comment on fait.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2010 à 15:40
ça manque un peu d'explication tout ça.
quelle fonction doit appeler l'autre et avec quel pointeur ?
pourquoi le passage en paramètre ne conviens pas ?
Un programme n'a pas forcément besoin d'être élégant. Surtout en ce qui concerne les variables globale qui bien utilisés et bien justifié sont très bien. (contrairement aux macros !)
0
Nabla's
Messages postés
18143
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 218
27 oct. 2010 à 15:45
oulalala lalalala

attention, j'ai vu une fois une macro qu'elle était bien (pour faire un log de l'execution d'un programme: récupérer le numéro de ligne de code ou on passe)
0
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2010 à 16:08
pour être plus précis : les macros fonctions, qui traitent des valeurs. Les autres sont très bien.
0
ydurce
Messages postés
78
Date d'inscription
samedi 9 octobre 2010
Statut
Membre
Dernière intervention
12 décembre 2010
18
27 oct. 2010 à 15:52
ben, c'est pas trés clair.

bon, à première vue , c'est un damier sorte de jeu de dames avec les pions blancs à 1 et les noirs à 2 (ou l'inverse), cases vides à 0.
jusque là, OK.
mais par contre , pour selectionner(), je n'ai pas tout compris (d'autant que les l et les 1 sont tout à fait identiques !!!).
Donc, le **p2=&p1; ne veut rien dire :affecter une adresse de pointeur local à un int (valeur d'une case), je vois mal où tu veux en venir.
et puis, je ne comprends pas l'utilisation de la récursivité !!
Et enfin, est-ce p2 que tu espéres voir de toutes tes fonctions ?

Si possible, donnes nous quelquesexplications
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 15:54
Désolé pour mes explications. Je veux renvoyer tab[l1][c1] utiliser dans selectionner pour le réutiliser dans pointeur.
Je ne sais pas comment faire.
0
Nabla's
Messages postés
18143
Date d'inscription
mercredi 4 juin 2008
Statut
Contributeur
Dernière intervention
28 avril 2014
3 218
27 oct. 2010 à 16:01
ben ... pourquoi pas en utilisant la valeur de retour ? t'as tout déclaré en int, et tu retournes que des 0 .... tu renvoies des int, int * , int ** ou int ********suivant tes besoins... par conter ca passe quand meme par le main ...
0
ydurce
Messages postés
78
Date d'inscription
samedi 9 octobre 2010
Statut
Membre
Dernière intervention
12 décembre 2010
18
27 oct. 2010 à 16:32
déclare selectionner comme çà:
int *selectionner(.....) et retourne ton pointeur (return &tab[l1][c1] par exemple) vers le main (comme dit nabla's) qui le redistribuera vers une autre fonction si necessaire.
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 16:05
p2 c'était pour un test. j'ai édité mon code, ça devrait être un peu plus clair.
je veux réutiliser tab[l1][c1] donc j'ai pensé passé par un pointeur *p1.
0
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2010 à 16:12
pourquoi ne pas appeler pointeur() dans selectionner() ?
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 16:20
en fait j'aurais une fonction qui prendra tab[l1][c1] et une variable tab[l2][c2] et qui devra changer leurs valeurs donc je peux pas appeler pointeur() dans selectionner(). Pointeur est une fonction qui sert pour essayer d'expliquer ce que je veux faire.
Nabla's je n'ai pas compris ce que tu as dis.
0
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2010 à 16:26
ui devra changer leurs valeurs donc je peux pas appeler pointeur() dans selectionner()
Pourquoi ? qu'est-ce qui gène ?
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 16:32
Je n'ai peut-être pas compris l'intérêt de le faire.
Pourriez-vous m'expliquer svp?

Si j'ai bien compris je ne peux pas mettre en paramètre tab[l1][c1] ou *p1 en paramètre directement dans les autres fonctions ?
0
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2010 à 16:40
pourquoi tu ne pourrai pas.
Il faut faire attention à ce que tu passes en paramètre et aux protections etc. mais tu passes ce que tu veux quand tu veux en paramètre.
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 16:52
J'ai fais ce que vous m'avez dit pour la fonction sélectionner() mais je n'arrive toujours pas à réutiliser tab[l1][c1].
Pourriez-vous me donner un exemple de fonctions svp ?


PS: Merci pour votre aide les gars
0
ydurce
Messages postés
78
Date d'inscription
samedi 9 octobre 2010
Statut
Membre
Dernière intervention
12 décembre 2010
18
27 oct. 2010 à 17:26
dans le main, tu fais:
int * ptr;
....
....
ptr=selectionner(tab);
pointeur(ptr); ou ce que tu veux avec
0
ghosta
Messages postés
25
Date d'inscription
samedi 21 mars 2009
Statut
Membre
Dernière intervention
1 février 2011

27 oct. 2010 à 17:51
ça marche!!!!!!!

Merci ydurce, Nabla's et Char Snipeur pour vôtre aide.
0