-1

これを列挙してWindowsで正しく動作させることはできません。Linux でコンパイルすると期待値が返されますが、Windows では乱数が返されます。

typedef enum wezly {
    elektrownie1,
    konwencjonalne1,
    niekonwencjonalne1,
    weglowa1,
    jadrowa1,
    sloneczna1,
    wiatrowa1,
    geotermiczna1,
    gazowa1,
    wodna1,
    maremotoryczna1,
    maretermiczna1
};

wezly wybor_wezla(string opcja)
{
    string bb;
    bb = opcja;

    if ((bb.compare("[elektrownie]")==0)||(bb.compare("[ELEKTROWNIE]")==0))
        return elektrownie1;
    else if ((bb.compare("[konwencjonalne]")==0)||(bb.compare("[KONWENCJONALNE]")==0))
        return konwencjonalne1;
    else if ((bb.compare("[gazowa]")==0)||(bb.compare("[GAZOWA]")==0))
        return gazowa1;
    else if ((bb.compare("[wodna]")==0)||(bb.compare("[WODNA]")==0))
        return wodna1;
    // (and so on...)
}

int main()
{

    cout << wybor_wezla("[gazowa]");
}

Linuxでは7を取得し、Windowsでは乱数を取得します....

なぜそれができるのですか?

4

2 に答える 2

3

実際にはここで壊れています(コメントで指定したリンクを見た後):

  bb=opcja.substr((opcja.find_first_of("[")),(opcja.find_first_of("]"))-1);

これにより、入力が「... [whatever] ...」の場合、「[whateve」のような文字列が抽出されます。

あなたの言いたいことは次のとおりです。

  bb=opcja.substr((opcja.find_first_of("[")),(opcja.find_first_of("]"))-opcja.find_first_of("[")+1);

その結果、入力から「[whatever]」のような文字列が抽出されます。

入力 "[gazowa]" が与えられた元のコードは、"[gazow" をさまざまな文字列と比較しますが、一致するものはなく、returnステートメントをヒットせずに関数の最後に到達します。

これにより、未定義の動作が発生します。したがって、Linux では 7 という結果になり、Windows ではその他の値[gazowa]が得られますが、8 になるはずです。

また、文字列がどれも一致しない場合、つまり の最後にwybor_wezla到達した場合を処理するために、より賢明なことを行う必要があります。その場合に何をするかはあなた次第ですが、最初は、何も一致しないときにわかるように、少なくとも print ステートメントをそこに入れておきます。

于 2012-12-17T23:49:47.723 に答える
1

あなたのコードには最後のelse節がありません:

wezly wybor_wezla(string opcja)
{
    if(...)
        return ...;
    else if(...)
        return ...;
    else if(...)
        return ...;
    // No final else!
}

いずれのif節も true でない場合、値を返さずに関数の最後に落ちます。これがUndefined Behaviorです。この場合、ガベージ値が返されますが、さらに悪いことが起こる可能性があります。

最初のアクションは、最終else節を追加することです。これは、デフォルト値、エラー コード、例外のスローabort()などを返すことができますが、何もすることはできません。値が限定された一連のものの 1 つでなければならないことがわかっている場合は、最後のものelse ifを単なる に変更し、それが最初のものでelseなければ、それがものであると想定できます。N-1Nth

それが完了したら、データが予想されるケースのいずれにも当てはまらない理由を突き止め、それを修正する必要があります。

于 2012-12-17T23:59:33.470 に答える