Mein Programm kompiliert ohne Fehler, und es funktioniert auch gut für einige Eingaben. Wenn ich jedoch eine Eingabe für die obere Grenze gebe, funktioniert die .exe-Datei nicht mehr und es wird keine Speicherabbilddatei erstellt.Segmentierungsfehler tritt manchmal im Programm auf, aber nicht immer. Wie korrigiere ich es?
Bitte helfen Sie mir auf diesem.
#include<stdio.h>
#include<stdlib.h>
#define SIZE 200000
double finval = 32766;
void addf(double st);
void rec(double** tam, long src, long des, double n, double sum);
void op(long u, long v, double** tam, long src, long dest, double n);
int main()
{
double n, m, q;
long c, t, i, j, s, d, u, v, w;
double** mat;
double** tam;
double** qe;
scanf("%lf", &n);
if(n > 0 || n <= SIZE) {
mat = (double **) malloc(n * sizeof(int *));
tam = (double **) malloc(n * sizeof(int *));
for(i = 0; i < n; i++) {
mat[i] = (double *) malloc(n * sizeof(int));
tam[i] = (double *) malloc(n * sizeof(int));
}
}
else
return 1;
scanf("%lf", &m);
if(m <= 0 || m>SIZE)
return 1;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++) {
mat[i][j] = 0;
tam[i][j] = 0;
}
for(i = 0; i < m; i++) {
scanf("%ld %ld %ld", &u, &v, &w);
mat[u][v] = mat[v][u] = w;
}
scanf("%ld %ld", &s, &d);
scanf("%lf", &q);
if(q > 0 || q <= SIZE) {
qe = (double **) malloc(q * sizeof(int *));
for(i = 0; i < q; i++)
qe[i] = (double *) malloc(2 * sizeof(int));
}
else
return 1;
for(i = 0; i < q; i++) {
scanf("%ld %ld", &u, &v);
qe[i][0] = u;
qe[i][1] = v;
}
for(i = 0; i < q; i++) {
for(c = 0; c < n; c++)
for(t = 0; t < n; t++)
tam[c][t] = mat[c][t];
finval = 32766;
op(qe[i][0], qe[i][1], tam, s, d, n);
printf("\n%g", finval);
}
for(i = 0; i < n; i++) {
free(mat[i]);
free(tam[i]);
}
free(tam);
free(mat);
for(i = 0; i < q; i++)
free(qe[i]);
free(qe);
return 1;
}
void op(long u, long v, double** tam, long src, long dest, double n)
{
double sum = 0;
tam[u][v] = tam[v][u] = 0;
rec(tam, src, dest, n, sum);
};
void rec(double** tam, long src, long des, double n, double sum)
{
double que[100], dat;
long front = -1, rear = -1;
long srec, ref;
ref = src;
for(; ref < n; ref++) {
if(tam[src][ref]! = 0) {
que[++rear] = ref;
}
}
if(src == des) {
addf(sum);
return;
}
else
while(front != rear) {
srec = que[++front];
dat = tam[src][srec];
rec(tam, srec, des, n, sum+dat);
}
/*for(i = 0; i < n; i++) {
for(j = 0;j < n;j++)
printf("%lf", tam[i][j]);
printf("\n");
}*/
};
void addf(double st)
{
if(finval > st) {
finval = st;
}
};
Ich benutze GCC-Compiler und ich habe auch versucht, die Gdb-Debugger, konnte aber das Problem nicht lösen.
Wenn Sie das Programm in gdb ausführen, geben Sie an der Eingabeaufforderung "gdb" "bt" ein, wenn der Segmentierungsfehler auftritt. Es wird ein Stack-Trace angezeigt, der zeigt, * wo * in dem Programm der Fehler aufgetreten ist. – Wyzard
Vielleicht meintest du: 'if (n> 0 && n <= SIZE) {...}' Außerdem: Beende die Castings und benutze die richtigen Typen (double statt int) – wildplasser
http://valgrind.org/ –