2013-02-25 5 views
2

У меня возникли проблемы с получением кода для компиляции. Вот мои ошибки:C++ Подписанное/неподписанное несоответствие

предупреждение 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); 
    } 
} 
+1

Дубликат http://stackoverflow.com/questions/7443222/how-do-i-deal-with-signed-unsigned-mismatch-warnings-c4018?rq=1? – Slava

+0

Извинения, я изучаю C++ и понимаю проблему (Unassigned int), но на самом деле не могу понять, как ее исправить в этом случае. – Madness

+0

Unsigned int не неназначенный, это не проблема, о которой вы задаете вопросы, проблема в том, что вы не проверяли, был ли получен ответ до – Slava

ответ

1

код вы вывесили не содержат определения для членов/функций в вопросе, но компилятор, вероятно, верный.

Какой ответ вы ожидаете?

либо исправить проблему (изменить элементы/функции/сделать стиль C cast/сделать static_cast < ...> и т. Д., Так что «подпись» с обеих сторон сравнения совпадает) или отключить это предупреждение с помощью подходящий #pragma

3

Это предупреждения, а не ошибки. Обычно код должен компилироваться, несмотря на предупреждения. Если вы, однако, указываете опцию компилятора «рассматривать предупреждения как ошибки», компилятор не будет компилироваться, если он вызывает какие-либо предупреждения (или ошибки).

Чтобы обойти это предупреждение, вы можете передать одну из неподписанных сторон логического оператора в int.

5

Подписанный/неподписанный характер двух значений, которые вы сравниваете, должен быть одним и тем же, в противном случае для сравнения сравниваться друг с другом, что может привести к неожиданным результатам.

Было бы лучше, чтобы убедиться, что вы сравниваете того же типа, но:

Если вы знаете, какое значение безопасно бросить, явно бросил тот. В вашем случае введите значение в качестве значения без знака.

например.

unsigned int val1 = someunsignedvalue; 
int val2 = somesignedvalue;  
if (val1 > (unsigned int) val2) { 
    /* do stuff */ 
} 
+0

, где «безопасный» означает «val2» is> = 0. –

+0

Спасибо, это очень помогло. Извиняюсь перед всеми, что это было опубликовано раньше, но мне просто не хватало понимания подписи int с другими. – Madness

+0

Итак, как я мог бы изменить свой код, чтобы быть правильным? – Madness

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