错误的bool值传递给C ++中的函数

时间:2016-11-02 13:17:19

标签: c++ function

我在头文件prog.h中定义了一个函数,它接受了bool,string和double类型的几个参数。

string createDataFolder(bool setPBC, string distribution, double timestep, double simtime, double potRange, double potStrength, 
    double particlesize, bool steric, bool ranRod, bool ranU, bool rand, double dvar, double polydiam, bool Pointq){
    //...
    if (Pointq) folder += "/pointq";
    //....
    return folder;
}

当我从prog.cpp中的main()函数内部通过

调用该函数时
string folder = createDataFolder(setPBC, distribution, timestep, simtime, urange, ustrength, 
     particlesize, includeSteric, ranRod, ranU, rand, dvar, polydiam, Pointq);

bool参数Pointq始终作为false传递,无论它是否设置为truefalse,即使我将该函数称为

string folder = createDataFolder(setPBC, distribution, timestep, simtime, urange, ustrength, 
     particlesize, includeSteric, ranRod, ranU, rand, dvar, polydiam, true);

如果我更改了函数定义的定义并调用,那么Pointq之后还有另一个参数,那么Pointq就会正确传递,也会传递最后一个参数。

string createDataFolder(bool setPBC, string distribution, double timestep, double simtime, double potRange, double potStrength, 
    double particlesize, bool steric, bool ranRod, bool ranU, bool rand, double dvar, double polydiam, bool Pointq, bool tmp){
    //...
    if (Pointq) folder += "/pointq";
    //....
    return folder;
}

string folder = createDataFolder(setPBC, distribution, timestep, simtime, urange, ustrength, 
     particlesize, includeSteric, ranRod, ranU, rand, dvar, polydiam, Pointq, true)

如果我改变createDataFolder函数的最后两个参数的顺序,它也可以。

string createDataFolder(bool setPBC, string distribution, double timestep, double simtime, double potRange, double potStrength, 
    double particlesize, bool steric, bool ranRod, bool ranU, bool rand, double dvar, bool Pointq, double polydiam){ ... }

我认为我的代码中存在一个愚蠢的错误,但我不知道在哪里看,因为我没有直觉,如何发生这样的错误。我在论坛上搜索了类似C ++的东西,但我找不到任何东西。

如果有人可以向我提供一些见解或指向相关主题,那将会很棒。

修改

这是一个在我的机器上仍会产生错误的最小例子

#include <iostream>


using namespace std;

void createDataFolder( double potRange, bool Pointq){
    char range[5];
    sprintf(range, "%.3f", potRange);
    cout << "in createDataFolder Pointq is " << Pointq << endl;
}

int main(int argc, const char* argv[]){    
    bool Pointq = true;
    double urange = 10;

    cout << "In main(), Pointq is " << Pointq << endl;
    createDataFolder( urange, Pointq);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

在此代码中:

char range[5];
sprintf(range, "%.3f", potRange);

你将10.0传递给potRange,所以sprintf应该产生字符串“10.000”,这肯定比5长。所以你有缓冲区溢出和所有UB效果。在这种情况下,您应该使用snprintf以避免花费很长时间来调试副作用:

char range[5];
snprintf(range, sizeof(range), "%.3f", potRange);

它不会使你的程序正确,但至少问题会变得明显。