У меня есть код, который был сделан не мной. В этом сложном коде применяется множество правил для вычисления величины d(x). в коде используется указатель для его вычисления.
Я хочу вычислить интеграл над этим, например: W= Int_0 ^L d(x) dx ?
Я делаю это:
#define DX 0.003
void WORK(double *d, double *W)
{
double INTE5=0.0;
int N_X_POINTS=333;
double h=((d[N_X_POINTS]-d[0])/N_X_POINTS);
W[0]=W[0]+((h/2)*(d[1]+2.0*d[0]+d[N_X_POINTS-1])); /*BC*/
for (i=1;i<N_X_POINTS-1;i++)
{
W[i]=W[i]+((h/2)*(d[0]+2*d[i]+d[N_X_POINTS]))*DX;
INTE5+=W[i];
}
W[N_X_POINTS-1]=W[N_X_POINTS-1]+((h/2)*(d[0]+2.0*d[N_X_POINTS-1]+d[N_X_POINTS-2])); /*BC*/
}
И я получаю «Ошибка сегментации». Мне было интересно узнать, правильно ли я поступаю при вычислении W как указателя или должен объявить его как простой двойной? Я предполагаю, что ошибка сегментации подходит для этого.
Другое дело, правильно ли я использую правило трапеций?
Любая помощь/совет, будем очень признательны.
Луис
double d[N_X_POINTS], W[N_X_POINTS]; /* ... */ WORK(d, W); /* ... */
или что-то в этом роде 26.06.2011double d[1000];
, если вы переходите к функции просто d, как вWORK(d, W)
, d является не чем иным, как указателем на двойные числа.*(d+1)
это d[1] и так далее. На самом деле в вашем РАБОЧЕМ коде, даже если у вас есть указатель, переданный как arg, он индексирует его как массив; это потому, что A[B] есть не что иное, как*(A+B)
. Может быть, это было ваше непонимание о func? 26.06.2011WORK(*(d)(),w)
. И сделать то же самое дляd
во всех других частях кода, где вычисляетсяd
? Возврат в конце каждого? P.S.: Прошу прощения за все эти глупые вопросы.... 27.06.2011