Programme C

maciass Messages postés 24 Date d'inscription   Statut Membre Dernière intervention   -  
Marco la baraque Messages postés 996 Date d'inscription   Statut Contributeur Dernière intervention   -
slt est ce que qlq un peut me dire quelle est l erreur dans le programme suivant:

#include <stdio.h>
#include <conio.h>
#define GRAPHSIZE 2048
#define INFINITY GRAPHSIZE*GRAPHSIZE
#define MAX(a, b) ((a > b) ? (a) : (b))



int e; /* The number of nonzero edges in the graph */
int n; /* The number of nodes in the graph */
long dist[GRAPHSIZE][GRAPHSIZE]; /* dist[i][j] is the distance between node i and j; or 0 if there is no direct connection */
long d[GRAPHSIZE]; /* d[i] is the length of the shortest path between the source (s) and node i */

void printD() {
int i;
for (i = 1; i <= n; ++i)
printf("%10d", i);
printf("\n");
for (i = 1; i <= n; ++i) {
printf("%10ld", d[i]);
}
printf("\n");
}

void dijkstra(int s) {
int i, k, mini;
int visited[GRAPHSIZE];

for (i = 1; i <= n; ++i) {
d[i] = INFINITY;
visited[i] = 0; /* the i-th element has not yet been visited */
}

d[s] = 0;

for (k = 1; k <= n; ++k) {
mini = -1;
for (i = 1; i <= n; ++i)
if (!visited[i] && ((mini == -1) || (d[i] < d[mini])))
mini = i;

visited[mini] = 1;

for (i = 1; i <= n; ++i)
if (dist[mini][i])
if (d[mini] + dist[mini][i] < d[i])
d[i] = d[mini] + dist[mini][i];
}
}

main() {
int i, j;
int u, v, w;

FILE *fin ;

fin= fopen("dist11.txt", "r");
fscanf(fin, "%d", &e);
for (i = 0; i < e; ++i)
for (j = 0; j < e; ++j)
dist[i][j] = 0;
n = -1;
for (i = 0; i < e; ++i) {
fscanf(fin, "%d%d%d", &u, &v, &w);
dist[u][v] = w;
n = MAX(u, MAX(v, n));
}
fclose(fin);

dijkstra(1);
printD();


getch();
}
a l execution il m affiche que mon projet.exe a rencontré un probleme et doit fermé
je peux savoir pourquoi?

1 réponse

Marco la baraque Messages postés 996 Date d'inscription   Statut Contributeur Dernière intervention   329
 
Salut,
En C les tableaux sont indicés à partir de 0.
Aussi, quand tu fais ceci :
for (i = 1; i <= n; ++i) {
printf("%10ld", d[i]);
} 
tu as un dépassement (et tu ne lis pas la première valeur).
L'accès à des données non autorisées produit un segmentation fault.

Il faut changer toutes tes boucles. Tu as peut-être d'autres bugs, mais ça ce sera déjà réglé.
Tiens nous au courant !
0