Я не знаю, откуда взялся этот код, но он очень уродливый и имеет некоторые ограничения, жестко закодированные (333 пункта и приращение на 0,003). Чтобы использовать его, вам нужно правильно «сэмплировать» свою функцию и сгенерировать пары (x, f (x)) ...
Возможное более ясное решение вашей проблемы: здесь .
Давайте рассмотрим вашу функцию и предположим, что она работает (я полагаю, что это не так, это действительно неясный код ...; например, когда вы интегрируете функцию, вы ожидаете число как результат; где это число? Может быть, INTE5? Он не возвращается ... и если это так, то почему окончательное обновление массива W? Это бесполезно, или, может быть, у нас есть что-то значимое в W?). Как бы вы его использовали?
Прототип
void WORK(double *d, double *W);
означает, что РАБОТА требует двух указателей. Что эти указатели должны быть, зависит от кода; если взглянуть на это, можно предположить, что вам действительно нужны два массива, каждый из которых содержит элементы N_X_POINTS. Код читает из массива W и записывает его, а читает только из d. Значение N_X_POINTS int равно 333, поэтому вам необходимо передать в функциональные массивы не менее 333 значений типа double:
double d[333];
double W[333];
Тогда вы должны заполнить их правильно. Я подумал, что вам нужно заполнить их (x, f (x)), выбрав функцию с правильным шагом. Но, конечно, это не имеет особого смысла. Уже сказано, что код неясен (теперь я не хочу пытаться изменить инженерию намерений кодера ...).
В любом случае, если вы позвоните с помощью WORK(d, W)
, вы не получите ошибку сегмента, так как массивы достаточно велики. Результат будет неправильным, но его сложнее отследить (опять же, извините, для этого нет «реверс-инжиниринга»).
Последнее замечание (из комментариев тоже): если у вас double a[N]
, то a
имеет тип double *
.