2013-02-25 2 views
2

J'ai du mal à compiler correctement du code. Voici mes erreurs:C++ Non-concordance signée/non signée

avertissement C4018: « > = »: incompatibilité signé/non signé

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

en double de http://stackoverflow.com/questions/7443222/how-do-i-deal-with-signed-unsigned-mismatch-warnings-c4018?rq=1? – Slava

+0

Excuses, j'apprends le C++ et comprends le problème (Unassigned int) mais ne peux vraiment pas comprendre comment le réparer dans cette instance. – Madness

+0

Non signé int non désaffecté, ce n'est pas un problème que vous posez des questions, problème que vous n'avez pas vérifié s'il a été répondu avant – Slava

Répondre

1

Le code affiché ne contenait pas les définitions pour les membres/fonctions en question, mais le compilateur est probablement correct.

Quel genre de réponse attendez-vous? Soit résoudre le problème (changer les membres/fonctions/faire un cast de style C/faire un static_cast < ...> etc de sorte que le "signedness" des deux côtés de la comparaison correspondent), ou désactiver cet avertissement avec le #pragma approprié

3

Ce ne sont pas des avertissements. Normalement, le code devrait compiler malgré les avertissements. Cependant, si vous spécifiez l'option du compilateur "traiter les avertissements en tant qu'erreurs", le compilateur ne compilera pas s'il produit des avertissements (ou des erreurs). Pour contourner cet avertissement, vous pouvez convertir l'une des faces non signées de l'opérateur logique en int.

5

La nature signée/non signée des deux valeurs que vous comparez doit être la même, sinon l'une est convertie comme l'autre pour la comparaison, ce qui peut entraîner des résultats inattendus.

Il serait préférable de vous assurer que ce que vous comparez sont du même type, mais:

Si vous savez quelle valeur est sûr de jeter, jeté explicitement que l'un. Dans votre cas, cassez la valeur signée en tant que valeur non signée.

par exemple.

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

où "safe" signifie 'val2' => 0. –

+0

Merci, cela a beaucoup aidé. Je m'excuse auprès de tout le monde que cela a déjà été publié auparavant, mais j'ai juste eu du mal à comprendre la signature des int avec les autres. – Madness

+0

Alors, comment pourrais-je réellement modifier mon code pour être correct? – Madness

Questions connexes