2016-11-02 8 views
1

私は関数bool、stringとdoubleの2つの引数を取るヘッダファイルprog.hに関数を定義しています。ブールパラメータPointqは常にfalseとして渡されC++の関数に渡された不正なbool値

string folder = createDataFolder(setPBC, distribution, timestep, simtime, urange, ustrength, 
    particlesize, includeSteric, ranRod, ranU, rand, dvar, polydiam, 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){ 
    //... 
    if (Pointq) folder += "/pointq"; 
    //.... 
    return folder; 
} 

私はprog.cppでの私のmain()関数内から関数を呼び出し、それがtrueに設定されている場合に関係なく、か私は関数定義とCAの定義を変更した場合、私は

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

としての機能を呼び出す場合でもfalsePointqの後に別のパラメータがあるようにすると、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関数の最後の2つの引数の順序を変更すると、同様に機能します。私は直感を持っていないので、このようなエラーが発生する可能性がどのように、

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++で類似のものを検索しましたが、何も見つかりませんでした。

誰かが私にいくつかの洞察を提供したり、関連するスレッドを指し示すことができれば、素晴らしいことになります。


EDIT

はまだここに私のマシン上でこのコードで

#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; 
} 
+0

これはどのようにデバッグしていますか? –

+0

サンプルを最小限に縮小して、それでも再現可能であるようにしてください。このプロセスでエラーが発生する可能性があります。 – Hayt

+0

問題を[MCVE]に絞り込みます。 1つだけの動作をテストして実証するために、90,000の関数パラメータは必要ありません。 –

答えて

3

をエラーが発生し、最小限の例です:

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

あなたはpotRangeに10.0を渡し、したがってsprintfはstを生成するはずですリング「10.000」は5よりもはるかに長いため、バッファオーバーランとそのUBのすべての効果があります。

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

それはあなたのプログラムが正しいことはないだろうが、少なくとも問題が明らかになるだろう:あなたは、副作用のデバッグに費やす長い時間を避けるために、このような場合にsnprintfを使用する必要があります。

+0

そして、バッファーサイズで十分です。 RAMは十分です。 –

+2

また、標準のC++ライブラリで 'ostringstream'クラスを探し、' sprintf() 'の代わりに書式設定された文字列を生成するために使用します。とりわけ、バッファ長を正しく取得することについて心配する必要はありません。それは、それがあなたの世話をするためです。 – Peter

関連する問題