0

Я являюсь tyring, чтобы сделать скорость Verlet методом, используя язык C. Я думал, что сделал это хорошо. Тем не менее, появляется всплывающее сообщение «Ошибка сегментации (core dumped)», когда я увеличиваю размер вектора или массива, x и y. Для размера n равным и меньше 1e3, это нормально, но в точке n = 1e4 программа получает ошибку.Неисправность сегмента при программировании C

Пожалуйста, помогите мне в этом. Спасибо.

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

double verlet(double t, double x) 
{ 

    double E = 0.252; 
    double B = 0.052; 
    double a = M_PI/2; 

    return -sin(x) + E*cos(t) + B*cos(2*t+a); 
} 

double pverlet(double(*f)(double, double), double dt, double t, double x, double y) 
{ 
    return x + dt*(y + (dt/2)*f(t, x)); 
} 

double vverlet(double(*g)(double, double), double dt, double t, double x, double y) 
{ 
    return y + (dt/2) * g(t, x); 
} 

int main(void) 
{ 
int i; 
double t; 

int n = 1e4; 
double ti = 0, tf = 1e5, dt = (tf-ti)/n; 

double *x = (double *) malloc(sizeof(double)*n); 
double *y = (double *) malloc(sizeof(double)*2*n); 

if (x == NULL) 
{ 
    printf("error allocating memory!\n"); 
    return 1; 
} 
if (y == NULL) 
{ 
    printf("error allocating memory!\n"); 
    return 1; 
} 

for (y[0] = 0, i = 1; i <2*n; i++) 
{ 
    y[i] = vverlet(verlet, dt, ti + dt*(i-1), x[i-1], y[i-1]); 
} 

for (x[0] = 0, i = 1; i < n; i++) 
{ 
    x[i] = pverlet(verlet, dt, ti + dt*(i-1), x[i-1], y[2*(i-1)]); 
} 



for (i = 0; i < n; i++) 
{ 
    t = ti + dt * i; 
    printf("%e %e %e\n", t, x[i], y[2*i]); 

} 

return 0; 
free(x); 
free(y); 
} 
+1

Вы пробовали отладку? –

+3

Первый цикл выходит за пределы 'x'. Он работает до 'i <2 * n' и относится к' x [i-1] ', но' x' имеет только элементы 'n' –

+0

Кроме того, вы никогда не инициализируете массив' x' перед использованием его содержимого. – JS1

ответ

3
for (y[0] = 0, i = 1; i <2*n; i++) 
{ 
    y[i] = vverlet(verlet, dt, ti + dt*(i-1), x[i-1], y[i-1]); 
} 

х определяется от 0 до N-1.

Смежные вопросы