Почему эта программа на C++ работает в некоторых компиляторах, а не в других? В чем главное отличие компиляторов с ++?

Я написал эту программу для своего класса. Я обнаружил, что он компилируется и прекрасно работает с компилятором GNU g++. Мой профессор автоматически оценивает наши программы на своем веб-сайте, который использует компилятор Microsoft Visual Studio и выдает ошибку. Я также пробовал эту программу в компиляторе BSD clang, и я получаю совершенно другую ошибку.

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;
double dec2Bin(int value, char binaryString[])
{
    int x = 1;
    string hold = "";
    while(x <= value){
        x *= 2;
    }
    x /= 2;

    while(x >= 1){
        //cout << x << " ";
        if(value > x){
            hold += "1";
            value -= x;
        }
        else if(value < x){
            hold += "0";
        }
        else if(value == x){
            hold += "1";
            value = 0;
            //return hold;
        }
        x /= 2;

        //cout << hold << endl;
    }
    return atoi(hold);

}
int main()
{
    char binstr[100];
    int num = 0;
    cout << "Enter a decimal string: ";
    cin >> num;
    cout << "its "<<dec2Bin(num, binstr) << endl;

}

Что делает все эти компиляторы такими разными? Что я могу сделать, чтобы мой код работал в любом компиляторе?

2 ответа

Решение

Ваш код неверен (звонки atoi прохождение std::string случай, когда функция ожидает const char * вместо этого), и он не должен компилироваться чисто. Учитесь всегда включать все предупреждения и учитесь понимать их значение.

Однако то, что указано в этом вопросе, действительно может произойти с C++, и причина кроется в "неопределенном поведении".

Когда вы делаете что-то не так во время выполнения в программе на C++, в большинстве случаев то, что происходит, совершенно непредсказуемо; он может дать сбой (если вам очень повезло), он может дать вам бессмысленные результаты (если вам повезет) или он может работать в любом случае, несмотря на вашу ошибку (наиболее опасный, но распространенный случай). Конечно, поведение может меняться в зависимости от компилятора, ОС, фазы луны.

Закон Мерфи, применяемый к C++, говорит, что все будет работать в любом случае, когда вы тестируете свою программу, но с треском провалится, когда вы находитесь на сцене, показывающей программу на большом экране перед огромной толпой, в которую входят ваш начальник и родители:-)

"Что делает все эти компиляторы такими разными? Что я могу сделать, чтобы мой код работал в любом компиляторе?"

Этот программный код на самом деле не будет работать с любым компилятором C++. Если у вас была программа, скомпилировавшая программу без каких-либо ошибок или предупреждений, она имеет серьезную ошибку (другое подозрение может заключаться в том, что вы не показываете свой оригинальный код здесь).

Когда я компилирую вашу программу на Ideone, я получаю следующее сообщение об ошибке

prog.cpp:34:21: error: cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*' for argument '1' to 'int atoi(const char*)'

Это указывает на то, что вы должны использовать

 return atoi(hold.c_str());

так как std::string не преобразуется автоматически в const char*, Упомянутый std::string::c_str() Функция есть, чтобы сделать это.

Также вы скучали по #include <string>и вместо using namespace std; тебе лучше лучше подробно написать std::string,

Вот скомпилированная чистая версия вашего кода.

Другие вопросы по тегам