繁体   English   中英

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

[英]Wrong bool value passed to function in C++

我在头文件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);

该布尔参数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;
}

在这段代码中:

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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM