首页 > 解决方案 > 奇函数指针分段错误

问题描述

我必须找到x的值,使得f(x)=C,其中f是区间[a,b]上的单调递增函数。它必须具有对数复杂度,所以我制作了这个我认为是正确的函数:

double search(double a, double b, double c, double (*f)(double x)) {
    double pivot;
    do {
        pivot = abs((a-b)/2);
        if (abs((*f)(pivot) - c) < 0.001) { //f(x) == c
            return pivot;
        } else if ((*f)(pivot) > c) {
            b = pivot;
        } else {
            a = pivot;
        }
    } while (abs(a-b) != 0);
    return 0;
}

每当我这样称呼它时,它都会起作用:

int main(void) {
    double a = 0.0, b = 10.0, c = 5.0;

    cout << search(a, b, c, func1) << endl;

    return 0;
}

但如果我把它改成这个(的值b):

int main(void) {
    double a = 0.0, b = 100.0, c = 5.0;

    cout << search(a, b, c, func1) << endl;

    return 0;
}

调用该函数时出现分段错误。这里出了什么问题?(我可以看到当我使用 VSCode 调试器时调用函数时程序崩溃。否则,当我只是编译并运行它时,它似乎陷入了无限循环或其他东西,即它不会引发分段错误错误)。

如果需要,func1只需return 2 * x.

编辑:

.cpp如果有人需要复制,这是完整的文件:

#include <iostream>
using namespace std;

double func1(double x) {
    return 2 * x;
}

double func2(double x) {
    return x + 0.5;
}

double search(double a, double b, double c, double (*f)(double x)) {
    double pivot;
    do {
        pivot = abs((b-a)/2);
        if (abs((*f)(pivot) - c) < 0.1) { //f(x) == c
            return pivot;
        } else if ((*f)(pivot) > c) {
            b = pivot;
        } else {
            a = pivot;
        }
    } while (abs(b-a) != 0);
    return 0;
}

int main(void) {
    double a = 0.0, b = 10.0, c = 5.0;

    cout << search(a, b, c, &func1) << endl;
    cout << search(a, b, c, func1) << endl;

    return 0;
}

其中将 b 的值更改为 100.0 将导致故障发生。

标签: c++functionsegmentation-faultfunction-pointers

解决方案


pivot = abs((a-b)/2);是错误的,因为它计算从ab的距离的一半而不是它们的中点,使用:

pivot = abs((a-b)/2)+a; // provided that *a* is less than *b*

推荐阅读