2016-11-02 6 views
1

У меня есть функция, определенная в файле заголовка prog.h, которая принимает пару аргументов типа bool, string и double.Неверное значение bool, переданное функции в C++

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 через

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

: параметр BOOL Pointq всегда передается как false, независимо от того, если он установлен в true или false, даже если я вызываю функцию как

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

Если изменить определение функции определения и са ll, так что есть еще один параметр после 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++, но я ничего не смог найти.

Было бы здорово, если бы кто-нибудь мог предоставить мне некоторые идеи или указать мне соответствующую тему.


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]. Вам не нужно 90 000 параметров функции для тестирования и демонстрации поведения только одного. –

ответ

3

в этом коде:

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

вы передаете 10,0 до potRange, поэтому sprintf должен производить ring "10.000", который определенно длиннее 5. Таким образом, у вас есть переполнение буфера и все эффекты с этим UB. Вы должны использовать snprintf в таких случаях, чтобы избежать длительного времени, затрачиваемого на отладку побочные эффекты:

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

это не сделает вашу программу правильно, но, по крайней мере, проблема станет очевидной.

+0

И будьте щедры с размерами буфера. ОЗУ много. –

+2

Или, еще лучше, посмотрите класс 'ostringstream' в стандартной библиотеке C++ и используйте его для создания форматированной строки вместо' sprintf() '. Помимо всего прочего, это будет означать, что вам не нужно беспокоиться о том, как правильно получить длину буфера, поскольку об этом позаботятся о вас. – Peter

Смежные вопросы