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);
}
Вы пробовали отладку? –
Первый цикл выходит за пределы 'x'. Он работает до 'i <2 * n' и относится к' x [i-1] ', но' x' имеет только элементы 'n' –
Кроме того, вы никогда не инициализируете массив' x' перед использованием его содержимого. – JS1