IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

passage de pointeurs


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut passage de pointeurs
    Voilà, je suis sensée remplir une liste chaînée mais le problème c'est que mes pointeurs ne passe pas bien dans mes fonctions, résultat:je n'ai pas la bonne valeur de mon ptrDeb à l'arrivée ce qui fait qu'il est toujours égal à NULL

    voici la fonction ou est déclaré ptrDeb:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    void MenuRes(FILE *FiFestiv, FILE *FiFestivInd)
    {
    	//int erreur;
       int choix,indice,i,nbC,icf;
       ListeR *ptrDeb=NULL;
       concert lectC;
       festival lectF;
       TabTemp TabTemp[LIMTAB];
       index tabindex[LIMTAB];
       FiFestiv = fopen("FiFestiv.Dat","rb");
       FiFestivInd = fopen("FiFestiv.Ind","rb");
       indice=ChargeTabInd(FiFestivInd,tabindex);
       fclose(FiFestivInd);
       indice--;
       for(i=0;i<3 && i<=indice;i++)
       {
       	lectC=LectureCP(FiFestiv,tabindex[i].depDebFic);
          TabTemp[i].adrFich=tabindex[i].depDebFic;
          TabTemp[i].nbPlRes=lectC.nbIns;
          TabTemp[i].nbPlA=0;
          TabTemp[i].nbPlE=0;
          strcpy(TabTemp[i].ind,"c");
          strcpy(TabTemp[i].codeT,lectC.code);
          TabTemp[i].nbPlMax=lectC.nbMax;
       }
       while(i<=indice)
       {
       	lectF=LectureF(FiFestiv,tabindex[i].depDebFic);
          nbC=lectF.nbConcerts;
          strcpy(TabTemp[i].ind,"f");
          i++;
    		for(icf=0;icf<nbC;icf++,i++)
          {
          	lectC=LectureCP(FiFestiv,tabindex[i].depDebFic);
             TabTemp[i].adrFich=tabindex[i].depDebFic;
             TabTemp[i].nbPlRes=lectC.nbIns;
             TabTemp[i].nbPlA=0;
          	TabTemp[i].nbPlE=0;
             strcpy(TabTemp[i].ind,"c");
          	strcpy(TabTemp[i].codeT,lectC.code);
             TabTemp[i].nbPlMax=lectC.nbMax;
          }
       }
       choix=0;
       while(choix!=4)
       {
       	flushall();
       	clrscr();
             printf("\n\n\n\n\t\t\t********************************\n");
             printf("\t\t\t*                              *\n");
      			printf("\t\t\t*     1. Creation              *\n");
    			printf("\t\t\t*                              *\n");
             printf("\t\t\t*     2. Impression            *\n");
             printf("\t\t\t*                              *\n");
    			printf("\t\t\t*     3. Annulation            *\n");
             printf("\t\t\t*                              *\n");
             printf("\t\t\t*     4. Menu principal        *\n");
             printf("\t\t\t*                              *\n");
             printf("\t\t\t********************************\n");
             printf("\n\n\t\t\t\tChoix: ");
    			choix = getchar();clrscr();flushall();
     
    	  		switch (choix)
    	  		{
    				case '1' :  ResCrea(FiFestiv,FiFestivInd,TabTemp,tabindex,ptrDeb,i);
                         	fflush(stdin);
             					break;
             	case '2' : Impression(FiFestiv,FiFestivInd,ptrDeb);
             			  	break;
             	case '3' : break;
             	case '4' :
             	MenuPrinc();
             	default:
             	clrscr();
          		printf("\n\n\n\n\n\n\t\t\t\t!!!!!!Choix invalide!!!!!!");
             	getch();
             	clrscr();
         	 	}
       }
    }
    Je fais donc passer mon pointeur à la fonction ResCrea

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    int ResCrea(FILE *FiFestiv, FILE *FiFestivInd,TabTemp TabTemp[],index tabIndex[],ListeR *ptrDeb,int i)
    {
       char NomPre[LIMCHAR],codeE[4];
       int ind,choix,ir,it,nbA,nbE,nbC=0,newR,ok,ic,tel;
       festival lectF;
       //TabTempP TabPers[LIMTAB];
       //TabTempR TabRes[LIMTAB];
       FiFestiv = fopen("FiFestiv.dat", "rb");
       FiFestivInd = fopen("FiFestiv.ind", "rb");
       if (i==0)
       {
       	printf ("!!!Liste concerts vide!!!");
          getch();
       }
       else
       {
          printf("\n\nveuillez introduire votre Nom(XXX=fin):");
          scanf("%s",&NomPre);
          printf("\n\nveuillez introduire votre telephone: ");
          scanf("%d",&tel);
       	while(strcmp(NomPre,"XXX")!=0)
          {
          	printf("desirez vous un abonnement(oui=1/non=0):");
          	scanf("%d",&ind);
             choix= menuchoix();
             if(choix=='3')
             {
             	strcpy(codeE,"XXX");
             }
             else
             {
             	printf("veuillez introduire le code (XXX=fin):");
             	scanf("%s",&codeE);
             }
             while(strcmp(codeE,"XXX")!=0)
             {
                for(ir=0;ir<=i && strcmp(codeE,tabIndex[ir].code)!=0;ir++);
                if(ir>i)
                {
                	printf("\n\n\t\t!!! Code n'existe pas !!!\n\n");
                   getch();
                   choix=menuchoix();
                   if(choix=='3')
             		{
             			strcpy(codeE,"XXX");
             		}
             		else
             		{
             			printf("veuillez introduire le code (XXX=fin):");
             			scanf("%s",&codeE);
             		}
                }
                else
                {
     
                   printf("combien d'adultes: ");
                	scanf("%d",&nbA);
                	printf("combien d'enfants: ");
                	scanf("%d",&nbE);
                   if(choix=='1')
                   {
          				for(it=0;it<=i && strcmp(codeE,TabTemp[it].codeT)!=0;it++);
                      TabTemp[it].nbPlRes+=nbA+nbE;
                      if(TabTemp[it].nbPlRes>TabTemp[it].nbPlMax)
                      {
                         TabTemp[it].nbPlRes-=nbA+nbE;
                      	printf("plus de place concert");
                         getch();
                      }
                      else
                      {
                      	TabTemp[it].nbPlA+=nbA;
                      	TabTemp[it].nbPlE+=nbE;
                      	AjoutListe(NomPre,ind,ptrDeb,TabTemp,tel,it);
                      }
                   }
                   else
                   {
                      if(choix=='2')
                      {
                      	for(it=0;it<=i && strcmp(codeE,tabIndex[it].code)!=0;it++);
                   		lectF= LectureF(FiFestiv,tabIndex[it].depDebFic);
                      	nbC=lectF.nbConcerts;
                         ok=0;
                      	ic=0;
                      	it++;
                      	while(ic<nbC && ok==0)
                      	{
                            TabTemp[it].nbPlRes+=nbA+nbE;
                         	if(TabTemp[it].nbPlRes>TabTemp[it].nbPlMax)
                         	{
                               TabTemp[it].nbPlRes-=nbA+nbE;
                         		printf("Plus de place pour ce festival");
                            	getch();
                            	ok=1;
                         	}
                         	else
                         	{
                         		TabTemp[it].nbPlRes+=nbA+nbE;
                            	TabTemp[it].nbPlA+=nbA;
                   				TabTemp[it].nbPlE+=nbE;
                            	AjoutListe(NomPre,ind,ptrDeb,TabTemp,tel,it);
                         		ic++;
                            	it++;
     
                         	}
                      	}
                   	}
                      else
                      {
                      	printf("\n\ndesirez-vous faire une nouvelle reservation?(1=oui/0=non):\n");
             				scanf("%d",&newR);
             				if(newR==1)
            		 			{
             					printf("\nveuillez introduire votre Nom(XXX=fin):");
             					scanf("%s",&NomPre);
                            printf("\n\nveuillez introduire votre telephone: ");
          						scanf("%d",&tel);
             				}
             				else
             				{
                            break;
             					//MenuRes(FiFestiv,FiFestivInd);
             				}
                      }
     
                   }
                   choix= menuchoix();
             		if(choix=='3')
             		{
             			strcpy(codeE,"XXX");
             		}
             		else
             		{
             			printf("veuillez introduire le code (XXX=fin):");
             			scanf("%s",&codeE);
             		}
     
             	}
             }
             printf("\n\ndesirez-vous faire une nouvelle reservation?(1=oui/0=non):\n");
             scanf("%d",&newR);
             if(newR==1)
             {
             	printf("\nveuillez introduire votre Nom(XXX=fin):");
             	scanf("%s",&NomPre);
                printf("\n\nveuillez introduire votre telephone: ");
          		scanf("%d",&tel);
             }
             else
             {
                MiseAjour(FiFestiv,i,TabTemp);
                break;
             	//MenuRes(FiFestiv,FiFestivInd);
             }
          }
       }
       MiseAjour(FiFestiv,i,TabTemp);
       //MenuRes(FiFestiv,FiFestivInd);
       return 0;
    }
    Ensuite je le fais passer à AjoutListe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    void AjoutListe(char NomPre[], int ind, ListeR *ptrDeb,TabTemp TabTemp[],int tel,int it)
    {
       int erreur,i=0;
       ListeR *Pprec,*Ptrouv;
    	ListeRtaire *Plist,*plistePrec,*pNewL;
    	Pprec=Ptrouv=NULL;
       RechercheRes(&ptrDeb,&Pprec,&Ptrouv,NomPre);
       if(Ptrouv==NULL)
       {
       	erreur=AjoutRes(NomPre,Pprec,&ptrDeb,ind,TabTemp,tel,it);
          if(erreur==1)
          {
             clrscr();
          	printf("!!! plus de place memoire !!!");
             getch();
          }
    	}
       else
       {
          printf("%s",Ptrouv->NomPreCh);
       	Plist=Ptrouv->ptrListe;
          while(Plist!=NULL && Plist->codeCh!=TabTemp[it].codeT)
          {
            i++;
            plistePrec=Plist;
            Plist=Plist->PtrSvt;
          }
          if(i==9 && ind==0)
          {
          	printf("!!!cota concert atteint!!!");
             getch();
          }
          else
          {
          	if(Plist==NULL)
          	{
          		pNewL=(ListeRtaire *)malloc(sizeof(ListeRtaire));
          		if(pNewL==NULL)
          		{
          			printf("\n!!!Plus de place memoire!!!\n");
                	getch();
          		}
          		else
          		{
          			strcpy(pNewL->codeCh,TabTemp[it].codeT);
          			printf("\n%s\n",pNewL->codeCh);
          			pNewL->nbAdCh=TabTemp[it].nbPlA;
          			printf("%d\n",pNewL->nbAdCh);
          			pNewL->nbenCh=TabTemp[it].nbPlE;
          			printf("%d\n",pNewL->nbenCh);
                   getch();
          			pNewL->PtrSvt=NULL;
                	plistePrec->PtrSvt=pNewL;
             	}
          	}
          	else
          	{
          		Plist->nbAdCh+=TabTemp[it].nbPlA;
             	printf("%d\n",Plist->nbAdCh);
             	Plist->nbenCh+=TabTemp[it].nbPlE;
             	printf("%d\n",Plist->nbenCh);
                getch();
          	}
          }
       }
    }
    Là je fais passer à RechercheRes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void RechercheRes(ListeR *ptrDeb,ListeR **Pprec, ListeR **Ptrouv, char NomPre[])
    {
    	*Ptrouv=ptrDeb;
       while(*Ptrouv!=NULL && strcmp(NomPre,(*Ptrouv)->NomPreCh)!=0)
       {
          *Pprec=*Ptrouv;
       	*Ptrouv=(*Ptrouv)->PtrSvt;
       }
    }
    et enfin, je fais passer un pointeur de pointeur à AjoutRes vu que j'y modifie ptrDeb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    int AjoutRes(char NomPre[],ListeR *Pprec,ListeR **ptrDeb,int ind,TabTemp TabTemp[],int tel,int it)
    {
    	ListeR *Pnew;
       ListeRtaire *Ptaire;
       Pnew=(ListeR *)malloc(sizeof(ListeR));
       if(Pnew==NULL)
       {
       	return 1;
       }
       else
       {
          if(Pprec==NULL)
          {
          	*ptrDeb=Pnew;
          }
          else
          {
       		Pprec->PtrSvt=Pnew;
          }
       	strcpy(Pnew->NomPreCh,NomPre);
          printf("%s",Pnew->NomPreCh);
          Pnew->tel=tel;
          Pnew->IndCh=ind;
          Pnew->PtrSvt=NULL;
          Pnew->ptrListe=NULL;
          Ptaire=(ListeRtaire *)malloc(sizeof(ListeRtaire));
          if(Ptaire==NULL)
          {
          	printf("\n!!!Plus de place memoire!!!\n");
          }
          else
          {
          	if(Pnew->ptrListe==NULL)
          	{
          	Pnew->ptrListe=Ptaire;
          	}
          	strcpy(Ptaire->codeCh,TabTemp[it].codeT);
          	printf("\n%s\n",Ptaire->codeCh);
          	Ptaire->nbAdCh=TabTemp[it].nbPlA;
          	printf("%d\n",Ptaire->nbAdCh);
          	Ptaire->nbenCh=TabTemp[it].nbPlE;
          	printf("%d\n",Ptaire->nbenCh);
             getch();
          	Ptaire->PtrSvt=NULL;
          }
          return 0;
       }
    }
    Voilà donc mon problème c'est qu'après tout ça, pas moyen de récupérer la valeur de ptrDeb dans Rescrea, à chaque fois il se remet à NULL

    Si quelqu'un avait la gentillesse de m'aider un peu ce serait super sympa...merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jen228
    Voilà, je suis sensée remplir une liste chaînée mais le problème c'est que mes pointeurs ne passe pas bien dans mes fonctions, résultat:je n'ai pas la bonne valeur de mon ptrDeb à l'arrivée ce qui fait qu'il est toujours égal à NULL
    Il y a des solutions atroces avec des pointeurs de pointeurs... Je déconseille. Par contre, je recommande d'organiser ta liste chainée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct node
    {
       /* link */
       struct node *p_next;
     
      /* data */
      ...
    };
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct list
    {
       struct node *p_head;
       struct node *p_tail;
     };
    et que toutes les fonctions aient un paramètre struct list *. Ca facilite grandement le codage et ça résout ton problèle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
       struct list my_list;
     
       f(&my_list);
       ...
    }
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    je recommande d'organiser ta liste chainée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct node
    {
       /* link */
       struct node *p_next;
     
      /* data */
      ...
    };
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct list
    {
       struct node *p_head;
       struct node *p_tail;
     };
    tant qu'à faire stocker un head et un tail, pourquoi ne pas faire une liste doublement chaînée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct node
    {
       /* link */
       struct node *p_next;
       struct node *p_prev;
     
      /* data */
      ...
    };
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Swoög
    tant qu'à faire stocker un head et un tail, pourquoi ne pas faire une liste doublement chaînée ?
    Pouquoi pas, mais je me suis contenté de fournir une réponse adaptée au problème du P.O qui ne parle pas de liste double...

    Nota : Le p_tail a son sens avec les listes simples pour ajouter rapidement en fin de liste...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Nota : Le p_tail a son sens avec les listes simples pour ajouter rapidement en fin de liste...
    Ah oui... effectivement ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

Discussions similaires

  1. Passage de pointeurs entre fonctions
    Par mickael.be dans le forum Langage
    Réponses: 3
    Dernier message: 02/01/2006, 21h01
  2. passage de pointeurs entre appli delphi et DLL c++
    Par e-teo dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 21h46
  3. Passage de pointeur en session
    Par goondi dans le forum Langage
    Réponses: 6
    Dernier message: 21/09/2005, 11h54
  4. Problème passage de pointeur
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 21/04/2004, 18h34
  5. [allegro]passage de pointeur sur image
    Par Gonath dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 13/12/2003, 18h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo