2012-03-28 4 views
1

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.

+2

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

+0

Vielleicht meintest du: 'if (n> 0 && n <= SIZE) {...}' Außerdem: Beende die Castings und benutze die richtigen Typen (double statt int) – wildplasser

+2

http://valgrind.org/ –

Antwort

4
(double *) malloc(n * sizeof(int)); 

Dies ist nicht richtig. Wenn Sie Platz für n double Nummern vergeben möchten, verwenden Sie malloc(n * sizeof(double)).

2

wenn n = SIZE oder sogar in der Nähe des Wertes von SIZE, als Sie Ihre Speichernutzung aufblasen wird die Speicherüberlauf Fall kann und das Programm zum Absturz bringen, da Sie malloc(n * sizeof(int *)) n-mal tun! so wird es wie 200000 Speicherzuweisungen der Größe 200000 * sizeof(int) jeder sein.

+0

yaaa ur Richtig ... aber was ist die Problemumgehung für dieses Problem ??? – Anvay

+0

Ich kenne nicht die Art Ihres Programms, aber versuchen Sie in Bulks zu arbeiten. Bedeutung eine angemessene Speichergröße zuordnen, verarbeiten, löschen und dann mit der nächsten Masse wiederholen. – giorashc

0

Quicksort ist bekanntlich knifflig. In Ihrem Code verhindert nichts i und j von left und right weg zu wandern, so dass sie sehr gut aus Ihrem Array abweichen können.

Verwandte Themen