2017-02-14 3 views
0

왜이 코드가 분할 오류를 반환하는지 이해할 수 없습니다. 아무도 나에게 잘못을 말하는 걸 도와 줄 수 있니?세그먼트 화 오류 11 - C

#include <stdio.h> 
#include "rk78.h" 
#include "flux.h" 
#include "rtbps.h" 

#define N 6 
#define h0 0.1 
#define pasmin 1E-6 
#define pasmax 10 
#define tol 1E-13 

int rk78 (double *t, double x[], double *h, 
      double hmin, double hmax, double tol, 
      int n, int (*camp)(int n, double t, double x[], double f[], void *prm), 
      void *prm); 

int flux (double *t, double x[], double *h, double T, 
      double pasmin, double pasmax, double tol, int npasmx, 
      int n, 
      int (*camp)(int n, double t, double x[], double f[], void *prm), 
      void *prm); 

int rtbps (int n, double t, double *x, double *f, void *prm); 
/* 
    Per compilar: 
    gcc -o rtbps_int -g -Wall rtbps_int.c rtbps.c flux.c rk78.c -lm 
    Executar: 
    ./rtbps_int 1.215058560962404e-2 <halos_inp.txt> halos.txt 
*/ 

int main (int argc, char *argv[]) { 
    double t,x[N],h,mu,T; 
    int i, nt; 
    if (argc!=2 
     || sscanf(argv[1],"%lf",&mu)!=1 
     ) { 
     fprintf(stderr, "./rtbps_int mu\n"); 
     return -1; 
    } 

    /* 
     posició, velocitat, temps, iteracions 
    */ 
    printf("Ok"); 
    while(scanf("%lf %lf %lf %lf %lf %lf %lf %d", 
       &x[0],&x[1], &x[2], &x[3],&x[4],&x[5],&T,&nt)==8){ 

     printf("%lf %lf %lf %lf %lf %lf %lf\n", t, 
       x[0],x[1],x[2],x[3],x[4],x[5]); 
     h=h0; 
     t=0; 
     for(i=1;i<=nt;i++){ 
      //t=0; 
      flux(&t,x,&h,T/nt,pasmin,pasmax,tol,nt,N,rtbps,&mu); 
      printf("%lf %lf %lf %lf %lf %lf %lf\n", t, 
        x[0],x[1],x[2],x[3],x[4],x[5]); 
     } 
    } 
    return 0; 
} 

맨 위에 내가 사용하는 기능의 프로토 타입을 복사했지만 작동하므로 문제가되지 않습니다.

감사합니다. 라인에서

+1

seg 오류 발생 후 무엇을 했습니까? 전혀 디버깅? 올바른 일은 디버거를 사용하여 다른 사람들에게 당신을 위해 디버깅을 요청하기 전에 가능한 한 문제를 디버깅하는 것입니다. 디버거는 어느 라인이 seg fault를 유발하고 있는지를 즉시 알려줍니다. – kaylum

+0

'& x [1]'등을 쓰고 있는데, 생각하지 않아도됩니다. '& (x [1])'을 사용해야합니다. 그렇지 않으면 당신은'(& x) [1]'을 얻습니다. 이것은 정의되지 않습니다. – Aganju

+0

@Aganju :'[]'는'&'보다 우선 순위가 높으므로'& x [0]'은 실제로'x [0]'의 주소로 평가됩니다. –

답변

0

:

printf("%lf %lf %lf %lf %lf %lf %lf\n", t, 
    x[0],x[1],x[2],x[3],x[4],x[5]); 

초기화 t 것처럼 그것은 나타나지 않습니다. 그것이 원인인지 확실하지 않지만 초기화를 시도하고 동일한 문제가 발생하는지 확인할 수 있습니다.

double t=0.0,x[N],h,mu,T; 

그 원인이 아니라면 실제로 신뢰하는 기능을 의심하기 시작합니다.

+0

세그먼트 화 오류가 발생하지 않습니다. 분할 오류는 실제로 잘못된 포인터를 사용하거나 외부 배열 경계에 액세스하기 때문에 항상 발생합니다. – Barmar

+0

초기화되지 않은'double' 변수를 출력하면 seg 오류가 발생하지 않을 것입니다. 나중에 몇 가지 다운 스트림 효과가 발생할 수 있습니다. – kaylum

+0

도움 주셔서 감사합니다 !! :디 –