3

一部のコードを正しくコンパイルするのに問題があります。ここに私のエラーがあります:

警告 C4018: '>=': 符号付き/符号なしの不一致

void Player::HasteCap()
{
    if (sWorld->getBoolConfig(CONFIG_PLAYER_HASTECAP_ENABLE))
        return;

    bool hasInstantHasteCap = (GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 0) == 1 
                            || GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1) == 1 
                            || GetFloatValue(UNIT_FIELD_BASEATTACKTIME + 2) == 1 
                            || GetFloatValue(UNIT_MOD_CAST_SPEED) == 0);

    if (m_baseRatingValue[CR_HASTE_MELEE] > sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT))
    {
        SetFloatValue(UNIT_MOD_CAST_SPEED, 0);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + BASE_ATTACK, 1);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + OFF_ATTACK, 1);
        SetFloatValue(UNIT_FIELD_BASEATTACKTIME + RANGED_ATTACK, 1);
    }

    else if (hasInstantHasteCap && m_baseRatingValue[CR_HASTE_MELEE] < sWorld->getIntConfig(CONFIG_PLAYER_HASTECAP_LIMIT))
    {
        SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f);
        SetRegularAttackTime();
        ApplyCastTimePercentMod(m_baseRatingValue[CR_HASTE_SPELL] * GetRatingMultiplier(CR_HASTE_SPELL), true);

        if (GetShapeshiftForm())
        {
            SpellShapeshiftEntry const* ssEntry = sSpellShapeshiftStore.LookupEntry(GetShapeshiftForm());
            if (ssEntry && ssEntry->attackSpeed)
            {
                SetAttackTime(BASE_ATTACK, ssEntry->attackSpeed);
                SetAttackTime(OFF_ATTACK, ssEntry->attackSpeed);
                SetAttackTime(RANGED_ATTACK, BASE_ATTACK_TIME);
            }
        }
    }

    if (CanModifyStats())
    {
        UpdateDamagePhysical(BASE_ATTACK);
        UpdateDamagePhysical(OFF_ATTACK);
        UpdateDamagePhysical(RANGED_ATTACK);
    }
}
4

3 に答える 3

7

比較する 2 つの値の符号付き/符号なしの性質は同じである必要があります。そうでない場合、比較のために一方が他方としてキャストされ、予期しない結果が生じる可能性があります。

比較するものが同じタイプであることを確認するのが最善ですが、次のようになります。

安全にキャストできる値がわかっている場合は、その値を明示的にキャストします。あなたの場合、符号付きの値を符号なしの値としてケースに入れます。

例えば

unsigned int val1 = someunsignedvalue;  
int val2 = somesignedvalue;    
if (val1 > (unsigned int) val2) {
    /* do stuff */  
}
于 2013-02-25T01:29:01.263 に答える
3

これらはエラーではなく警告です。通常、警告があってもコードはコンパイルされます。ただし、「警告をエラーとして扱う」コンパイラ オプションを指定すると、コンパイラは警告 (またはエラー) を生成してもコンパイルしません。

この警告を回避するには、論理演算子の符号なし側の 1 つを int にキャストします。

于 2013-02-25T01:26:53.827 に答える
1

投稿したコードには、問題のメンバー/関数の定義が含まれていませんでしたが、コンパイラはおそらく正しいです。

あなたはどのような答えを期待していますか?

問題を修正する (メンバー/関数を変更する/C スタイルのキャストを実行する/static_cast<...> を実行するなどして、比較の両側の「署名」が一致するようにする) か、適切な #pragma を使用してこの警告を無効にする

于 2013-02-25T01:25:45.003 に答える