Procédure dans procédure

Résolu/Fermé
giovedy - Modifié par giovedy le 6/10/2011 à 21:36
 giovedy - 7 oct. 2011 à 11:54
Bonjour,

j'aimerai utiliser une procédure dans une autre procédure avec des mêmes arguments.
Je serai bien tenté d'utiliser à la fois le * et le & sur la même variable mais je sais pas comment l'écrire.

Pour être plus clair voici mon bout de programme (la variable qui me pose problème est listesommet)

#include <stdio.h>  
#define Max 100  

/********************************************************************************/  
/*                       DECLARATIONS DES TYPES                             */  
/********************************************************************************/  

typedef int couleur[Max];  

typedef struct sommet   
{  
 int numero;  
 int degre;  
 couleur couleursommet;  
}sommet;  

typedef struct arc   
{  
 sommet sommetdedepart;  
 sommet sommetdarrivee;  
}arc;  


/********************************************************************************/  
/*                       PROCEDURES ET FONCTIONS CORRECTES                       */  
/********************************************************************************/  
void calculdegre(sommet *sommet1, arc listearc[],int nbarc)      
{  
 int i=0;   
 int compteur=0;  
   
 for (i=0;i<=nbarc-1;i++)                     
 {  
  if((listearc[i].sommetdedepart.numero==(*sommet1).numero)||(listearc[i].sommetdarrivee.numero==(*sommet1).numero))  
  {  
   compteur=compteur+1;  
  }   
 }  
 (*sommet1).degre=compteur;                   
}  


/********************************************************************************/  
/*                       PROCEDURE EN COUR DE CREATION                          */  
/********************************************************************************/  

void calculertouslesdegres(arc listearc[],sommet listesommet[],int nbsommet,int nbarc)      
{  
 int i;  
 for(i=0;i<=nbsommet-1;i++)  
 {  
 calculdegre(&listesommet[i],listearc,nbarc);  
 }    
}  

/********************************************************************************/  
/*                       PROGRAMME PRINCIPAL                                   */        
/********************************************************************************/  

void main (void)  
{  
 sommet listesommet[Max],listesommetretour[Max];  
 arc listearc[5*Max];   
 sommet a;  
 int nbsommet=2;  
 int nbarc=3;  
 a.numero=1;  
 listesommet[0]=a;  
 listearc[0].sommetdedepart=a;  
 listearc[1].sommetdedepart=a;  
 listearc[2].sommetdedepart=a;  
 calculertouslesdegres(listearc,&listesommet,nbsommet,nbarc);  
 printf("\n%d\n",a.degre);    

}

1 réponse

KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
6 oct. 2011 à 21:52
listesommet est un tableau donc c'est déjà un pointeur.

Tu peux écrire calculertouslesdegres(listearc,listesommet,nbsommet,nbarc).
Ainsi c'est déjà le pointeur que tu passes en paramètre.
Et pour passer le pointeur de listesommet[i] tu peux faire listesommet+i

Attention : a.degre n'est pas initialisé.
Note : quand on a une structure en pointeur (*s).c on note souvent s->c
0
je suis d'accord avec ; calculertouslesdegres(listearc,listesommet,nbsommet,nbarc)

mais quand je test le programme, a.degre a la bonne valeur dans la procédure calculertouslesdegres. Mais dans le main, a.degre n'a pas changé de valeur.


ps : j'ai pas compris le coup du "listesommet+i ". A quoi correspond il ? Que doit il remplacer ?
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
6 oct. 2011 à 22:29
Sauf erreur de ma part, listesommet+i, devrait faire la même chose que &(listesommet[i])
C'est à dire te renvoyer le pointeur de listesommet mais décaler de i...

Pour le reste il faudrait que tu expliques ce que tu veux faire pour savoir où ça coince !
0
mon but :
au début le sommet "a" qui est dans listesommet[0] a un degré quelconque .
au retour de la procédure, j'aimerais que a.degré soit initialiser.

ici, pour le moment,
a.degré a la bonne valeur dans la procédure calculertouslesdegres, mais à son "retour" dans le main, a.degré n'est plus a la bonne valeur.
0
KX Messages postés 16760 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
7 oct. 2011 à 08:37
Le problème c'est que comme tu fais, tu dois surement modifier listesommet[0], [1] et [2], mais il n'y a aucune raison que cela modifie a...
Si tu veux le passer par référence tu dois mettre dans ton struct arc, sommet *sommetdedepart; et ensuite faire listearc[0].sommetdedepart=&a;
0
merci tu a raison !!! je regardais la valeur de a.degre au lieu de regarder la valeur de listesommet[0].degre

trop cool
0