-
segmentation fault
Hey guys, when I try and execute the following code I get a segmentation fault. I tried using gdb to trace it and I'm pretty sure the fault is either in fscanf(fin, "%d", &e); or in fscanf(fin, "%d%d%d", &u, &v, &w); however I can't seem to fix it.
Would anyone be able to help me correct this fault?
Thanks in advance
Code:
#include <stdio.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];
}
}
int main(int argc, char *argv[]) {
int i, j;
int u, v, w;
FILE *fin = fopen("dist.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();
return 0;
}
-
If you compile your code with debug symbols (the -g flag) you will get much better value from your debugger. It should be able to tell you exactly which line the segfault occurs and which variable it is trying to access that results in the segfault.
-
1) We don't have a copy of "dist.txt" to see what it is you're expecting.
2) We don't know what you're expecting anyway.
3) If the problem is suspected to be in fscanf, why don't you check it's return value to see if it did it properly? Or at the very least see what you're passing to it BEFORE you pass it to fscanf? Same applies to fopen!
4) It might also be an idea to printf some values as you go, e.g. of the line read from the files by the code, of the values of i, j, u, v, w, etc. before you start doing array accesses using u and v.