2017-02-14 12 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 .. и многое другое. – kaylum

+0

Вы используете '& x [1]' и т. Д., Что делает _not_, что вы думаете. Вам нужно использовать '& (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

Благодарим за помощь! : D –