Bonjour,

Cette fois ci c'est une fonction que m'a présentée mon professeur et qui fait partie d'un programme .
Cette fonction plante à la compilation . J'aimerais savoir où se trouve l'erreur ?
Il ya les stuctures déclarées en début de programme :

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
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
#define NBVILLE 20
#define LONGNOM 30
#define NBVILLES 20
#define NBCHEMINS 5
 
struct matrice {
	short int ville_suiv;
	short int distance;
};
 
typedef struct {
	short int num_ville;
	short int num_suiv;
} ITINERAIRE;



Ce n'est pas un code créé par moi mais mon prof me l'a envoyé et j'aimerais essayer déjà de comprendre le code et de le corriger pour qu'il fonctionne
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
/****************************************************************************/
/*                 fonction optimise                                        */
/****************************************************************************/
 
void fonction_optimise(int nombre_de_ville,char *pville,struct matrice *pchemin, ITINERAIRE *Citi)
{
	/*déclaration des variables locales*/
	int long_opti=32000,long_iti=0;
	int optimal[NBVILLES];
	int ville_depart,ville_arrive;
	int i;
 
	/*déclaration de la variable d'incrémentation du pointeur chemin*/
	/*elle me permet de sauvegarder le dernier déplacement*/
	int c=0;
 
	/*déclaration de la variable existe pour indiquer si la ville est déjà*/
	/*présente ou non dans le tableau Diti*/
	int existe=0;
 
	/*déclaration de pointeur itinéraire*/
	/*opti qui va permettre de copier le tableau Diti dans le tableau optimal*/
	/*et Fin qui conservera l'adresse du tableau Diti afin de faire un test*/
	/*pour ne pas aller en négatif*/
    ITINERAIRE *Opti;
	ITINERAIRE *Fin;
 
	/*déclaration du pointeur Fiti qui me permettra de tester que la ville*/
	/*suivante ne se trouve pas déjà dans le tableau Diti ainsi qu'une variable*/
	/*f pour son déplacement*/
	ITINERAIRE *Fiti;
	int f=0;
 
	/*initialisation des pointeurs ITINERAIRE*/
	Fiti=Citi;
	Opti=Citi;
	Fin=Citi;
 
	/*affichage des villes et des numéros existants*/
	printf("\nchoix des villes\n");
	printf("\n%s\t%s\n","Numero","Nom");
 
	/*cette boucle for me permet d'afficher les numéros de ville et*/
	/*les villes de  à nombre de ville-*/
	for(i=0;i<nombre_de_ville;i++)
	{
		printf("\n%i\t%s",i+1,pville+i*LONGNOM);
	}
 
	/*saisie du parcours*/
	printf("\n\nveuillez entrer la ville de depart : ");
	scanf("%i",&ville_depart);
	ville_depart--;
 
	printf("\nveuillez entrer la ville d arrivee : ");
	scanf("%i",&ville_arrive);
	ville_arrive--;
 
	/*je décrémente mes variables por travailler de 0 à x*/
 
	/*1ère phase initialisation du tableau Diti*/
	Citi->num_ville=ville_depart;
	Citi->num_suiv=0;
 
	/*2ème phase: boucle effectuée jusqu'à la fin*/
 
	/*positionnement du pointeur dans le tableau CHEMIN*/
	/*soit le 1er chemin de la ville de depart*/
	pchemin=pchemin+ville_depart*NBCHEMINS;
 
	/*boucle qui tourne avec un goto*/
    boucle:
 
	do
	{
		/*test que la ville suivante soit différente de -1*/
		if(pchemin->ville_suiv!=-1)
		{
			/*teste si la ville est déjà présente dans Diti*/
			/*et sauvegarde le résultat dans la variable existe*/
			do
			{
				if(pchemin->ville_suiv!=Fiti->num_ville)
				{
					f++;
					Fiti++;
				}
				else
					existe=1;
			}while(f<NBVILLES&&existe==0);
 
			/*je réinitialise mon pointeur Fiti au début du tableau de Diti*/
			Fiti=Fiti-f;
 
			/*je réinitialise ma variable de déplacement de pointeur à 0*/
			/*pour la prochaine boucle*/
			f=0;
 
			/*si la ville n'est pas déjà présente dans Diti alors on incrémente*/
			/*Citi et on renseigne les champs de Diti*/
			if(existe==0)
			{
				Citi++;
				Citi->num_ville=pchemin->ville_suiv;
				Citi->num_suiv=0;
 
				/*on incrémente long iti*/
				long_iti=long_iti+pchemin->distance;
			}
			else
				/*si la ville existe déjà on incrémente Citi->num_suiv*/
				Citi->num_suiv=Citi->num_suiv+1;
		}
		else
		{
			/*retour au début du tableau chemin*/
			pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
 
			/*je réinitialise les valeurs courantes de Citi*/
			Citi->num_ville=-1;
			Citi->num_suiv=0;
 
			/*je décrémente mon pointeur Citi*/
			Citi--;
 
			/*je teste que je sois bien dans le tableau pour éviter les erreurs*/
			if(Citi>=Fin)
			{
				/*positionnement du pointeur dans le tableau chemin*/
				/*avec les nouvelles valeurs courantes de Citi*/
				ville_depart=Citi->num_ville;
				c=Citi->num_suiv;
				pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
 
				/*je déduis la distance du chemin Citi->num_suiv*/
				long_iti=long_iti-pchemin->distance;
 
				/*j'incrémente la valeur de Citi->num_suiv pour essayer un autre chemin*/
				Citi->num_suiv=Citi->num_suiv+1;
			}
		}
 
		/*retour au début du tableau chemin*/
		pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
 
		/*positionnement du pointeur dans le tableau chemin*/
		ville_depart=Citi->num_ville;
		c=Citi->num_suiv;
		pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
 
		/*je réinitialise ma variable existe à 0 pour la prochaine boucle*/
		existe=0;
	}while(Citi->num_ville!=ville_arrive&&Citi>=Fin);
 
	/*le while ci dessus s'arrête lorsque le parcours optimal est trouvé*/
	/*ou lorsque le pointeur Citi se retrouve au début de tableau*/
	/*cela l'empêche d'être inférieur au tableau*/
 
	/*je teste si long iti est le chemin optimal ou pas*/
	/*si c'est le cas , je sauvegarde l'itinéraire dans le tableau optimal*/
	if(long_iti<long_opti&&Citi>=Fin)
	{
		long_opti=long_iti;
 
		/*copie du tableau Diti dans le tableau optimal*/
		/*la variable 'i' me sert aussi à compter le nombre de*/
		/*déplacement du pointeur pour pouvoir le réinitialiser ensuite*/
        for(i=0;i<NBVILLES;i++)
		{
			optimal[i]=Opti->num_ville;
			Opti++;
		}
		Opti=Opti-i;
	}
 
	/*la ville d'arrivée a été trouvée, je réinitialise mes variables de Citi courant*/
	/*puis je le décrémente . Ensuite je déduis la distance du chemin Citi->num suiv*/
	/*et j'augmente Citi->num suiv pour essayer un autre chemin*/
	/*par contre si Citi est inférieur à Fin cela veut dire qu'une boucle testant*/
	/*le -1 l'a sortit du tableau et que tous les chemins ont été essayés*/
	if(Citi>Fin)
	{
		Citi->num_ville=-1;
		Citi->num_suiv=0;
		Citi--;
 
		/*retour au début du tableau chemin*/
		pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
 
		/*positionnement du pointeur dans le tableau chemin*/
		ville_depart=Citi->num_ville;
		c=Citi->num_suiv;
		pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
 
		/*remise à jour de long iti*/
		long_iti=long_iti-pchemin->distance;
 
		/*j'incrémente la valeur de Citi->num suiv pour essayer un autre chemin*/
		Citi->num_suiv=Citi->num_suiv+1;
 
		/*retour au début du tableau chemin*/
		pchemin=pchemin-(ville_depart*NBCHEMINS)-c;
 
		/*positionnemlent du tableau pointeur dans le tableau chemin*/
		ville_depart=Citi->num_ville;
		c=Citi->num_suiv;
		pchemin=pchemin+(ville_depart*NBCHEMINS)+c;
 
		/*goto boucle me permet de faire recommencer toute la boucle de recherche*/
		/*du parcours optimal*/
		goto boucle;
	}
 
	/*troisième phase : Fiti est inférieur à Diti*/
 
	/*affichage de la longueur optimale*/
	printf("\nla longueur optimale est de : %i\n",long_opti);
 
	/*affichage du parcours*/
	i=0;
 
	printf("\nles villes a traverser sont :\n");
 
	do
	{
		printf("\n\t%s",pville+(optimal[i]*LONGNOM));
		i++;
	}while(optimal[i]!=-1);
}