为什么另一个函数输出错误的值

Why does the other function output the wrong values?

本文关键字:错误 输出 另一个 函数 为什么      更新时间:2023-10-16

我正在编写一个根查找程序。我已经在这个错误上呆了几个小时了。代码对我来说似乎是对的,但终端输出是错误的。而这个新手在他的职能中有很多论据。我希望你们不要介意。

是的,我已经一遍又一遍地编译代码。

这些是麻烦的台词。下面是我认为相关的所有行。它不是分别输出exp(-x) - xNewton-Raphson,而是给了我Restart selectionexp(-4*x) - x

printf("%25s:%20sn", "Equation", a[eq-1].c_str());
printf("%25s:%20sn", "Method", b[meth-1].c_str());

以下是 main() 中的相关变量。

vector<string> functName;
vector<string> methodName;
vector<string> advSettings;
int c_eq = 0;
int c_met = 0;
int c_settings = 0;
double c_guess1 = 0;
double c_guess2 = 0;
// defaults
int sigFigs = 6;
int iter = 1000;
int iterMode = 0;
int perIter = 0;
int plotMode = 0;
functName.push_back("exp(-x) - x");
functName.push_back("exp(-2*x) - x");
functName.push_back("exp(-3*x) - x");
functName.push_back("exp(-4*x) - x");
methodName.push_back("Newton-Raphson");
methodName.push_back("False Position");
methodName.push_back("Bisection");
methodName.push_back("Secant");
advSettings.push_back("Proceed with settings");
advSettings.push_back("Restart selection");
advSettings.push_back("Change advanced settings");

这是第一个正确输出内容的函数。

template <typename inputType>
void basicInterface(const vector<string> &a,
                    const vector<string> &b,
                    int eq,
                    int meth,
                    inputType &root1,
                    inputType &root2)
{
    cout << "Input the corresponding number of your choice.n";
    cout << "Choose an equation to solve:n";
    for (int i = 0; i < a.size(); i++)
        cout << "[" << i+1 << "] " << a[i] << endl;          // line of interest
    cout << " >>> ";
    inputCheck(eq,1,4);
    cout << "Choose a method to use:n";
    for (int i = 0; i < b.size(); i++)
        cout << "[" << i+1 << "] " <<  b[i] << endl;         // line of interest
    cout << " >>> ";
    inputCheck(meth,1,4);
    // more stuff
}

感兴趣的线路在我的终端中输出以下内容,这是正确的。

[1] exp(-x) - x
[2] exp(-2*x) - x
[3] exp(-3*x) - x
[4] exp(-4*x) - x
[1] Newton-Raphson
[2] False Position
[3] Bisection
[4] Secant

另一个函数,应该显示所有的东西,

template <typename inputType>
void showSettings(  const vector<string> &a,
                    const vector<string> &b,
                    int eq,
                    int meth,
                    inputType root1,
                    inputType root2,
                    int sigs,
                    int showPerLoop,
                    int plotRoots,
                    int loopMode,
                    int minLoops)
{
    cout << "Requirements satisfied.n";
    printf("%25s:%20sn", "Equation", a[eq-1].c_str());
    printf("%25s:%20sn", "Method", b[meth-1].c_str());
    if(meth-1 == 1)
        printf("%25s:%20fn", "Initial Guess", root1);
    else
    {
        printf("%25s:%20fn", "Initial Guess 1", root1);
        printf("%25s:%20fn", "Initial Guess 2", root2);
    }
    printf("%25s:%20dn", "Minimum Sig Figs", sigs);
    printf("%25s:%20d (1 if true)n", "Show Root per Iteration", showPerLoop);
    printf("%25s:%20d (1 if true)n", "Show Root Graph", plotRoots);
    printf("%25s:%20d (1 if true)n", "Iteration Mode", loopMode);
    printf("%25s:%20dn", "Minimum Iterations", minLoops);
}

几乎给出了完美的输出。

                 Equation:   Restart selection        // where did these
                   Method:       exp(-4*x) - x        // come from?
          Initial Guess 1:            1.000000
          Initial Guess 2:            0.000000
         Minimum Sig Figs:                   6
  Show Root per Iteration:                   0 (1 if true)
          Show Root Graph:                   0 (1 if true)
           Iteration Mode:                   0 (1 if true)
       Minimum Iterations:                1000

以下是我用来调用这两个函数的行。

    basicInterface( functName,
                    methodName,
                    c_eq,
                    c_met,
                    c_guess1,
                    c_guess2);
    showSettings(   functName,
                    methodName,
                    c_eq,
                    c_met,
                    c_guess1,
                    c_guess2,
                    sigFigs,
                    perIter,
                    plotMode,
                    iterMode,
                    iter);

你发布了很多代码。但似乎这两行会产生您的输出。

printf("%25s:%20sn", "Equation", a[eq-1].c_str());
printf("%25s:%20sn", "Method", b[meth-1].c_str());

eqmeth 均为 0。这会导致访问索引 -1 处的向量。如果不确定,请使用 at 而不是运算符 [] 来检查传递的边界。 如果索引无效,at将引发异常; operator []将静默失败并产生 UB。