Bu C4800 uyarısı alıyorum ve onunla ilişkili YOK int değerlerine sahip bir kod satırına işaret:Neden "C4800: 'int': boole değerini zorlamak" ALL bool değerleriyle oluyor?
CO.Value = (GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value);
Her .Value
özellik türü bool
taşımaktadır.
VS2015, C++/CLI kullanıyorum ve bu özelliklerin her birinin yayınlandığı kendi türümü BOOL türettiğim halde, kodumu win32 türünde BOOL
için hiçbir başvuru bulamadım.
Bu projede 200'den fazla diğer .cpp
dosyam var ve bu kod binlerce satırlık kod içeriyor, ancak bu uyarıyı yalnızca bu satır için aldım.
bir endişe daha merakı bu daha
, kolayca mantıksal (aşağıya bakınız) operatörlerini kullanarak hata kurtulmak, ancak herkes herhangi bir fikir varsa onları duymak ister. Ben göndermeden önce bu hatayı arama yaptı, ama (çoğunlukla insanlarint
türlerini kullanarak ve döküm sorunlarınız EDİLDİ.)
CO.Value = (GE_DUAL.Value && GE_SINGLE.Value) || (!GE_DUAL.Value && !IN_TMR.Value);
Üç satır aşağı ben bu satırı var tatmin edici bir cevap aldım:
DUAL.Value = GE_DUAL.Value & !IN_TMR.Value;
public ref class BOOL : IPS::Properties::Bool
{
public:
BOOL() : Bool() {}
BOOL(bool val) : Bool() { Value = val;}
operator bool() { return (bool)ValueAsObject;}
BOOL(BOOL% b) { m_Value = b.m_Value;}
};
: hiç uyarı alır
... İşte dahil kod daha tam listesi
...
BOOL^ m_IN_TMR;
BOOL^ m_GE_DUAL;
BOOL^ m_GE_SINGLE;
BOOL^ m_CO;
...
virtual property BOOL% IN_TMR
{
BOOL% get();
void set(BOOL% val);
}
virtual property BOOL% GE_DUAL
{
BOOL% get();
void set(BOOL% val);
}
virtual property BOOL% GE_SINGLE
{
BOOL% get();
void set(BOOL% val);
}
virtual property BOOL% CO
{
BOOL% get();
void set(BOOL% val);
}
...
void _TR_VOTE_MODE::IN_TMR::set(BOOL% val)
{
m_IN_TMR = %val;
}
BOOL% _TR_VOTE_MODE::GE_DUAL::get()
{
return *m_GE_DUAL;
}
void _TR_VOTE_MODE::GE_DUAL::set(BOOL% val)
{
m_GE_DUAL = %val;
}
BOOL% _TR_VOTE_MODE::GE_SINGLE::get()
{
return *m_GE_SINGLE;
}
void _TR_VOTE_MODE::GE_SINGLE::set(BOOL% val)
{
m_GE_SINGLE = %val;
}
BOOL% _TR_VOTE_MODE::CO::get()
{
return *m_CO;
}
...
CO.Value = CI.Value;
if (CI.Value)
{
CO.Value = (GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value); // Warning C4800??
if (CO.Value)
{
TMR.Value = IN_TMR.Value;
DUAL.Value = GE_DUAL.Value & !IN_TMR.Value;
SINGL.Value = GE_SINGLE.Value & !GE_DUAL.Value;
ZERO.Value = ! GE_SINGLE.Value;
}
else
{
U.Value = ReportBadParam(0);
TMR.Value = false;
DUAL.Value = false;
SINGL.Value = false;
ZERO.Value = false;
}
}
GÜNCELLEME Bazı testler yaptım ve göründüğü kadar az olduğu gibi, bu kod satırı benim binlerce diğer 10 kod satırım arasında bile benzersizdi. Sadece SADECE aritmetik operatörlerini kullanma meselesiydi.Ben de benzer düşünce Diğer tüm hatlar (aritmetik karışmış) onlarda mantıksal operatör çeşit vardı
Yolun bu bölümü gibi görünen: yani aritmetik çünkü
(GE_DUAL.Value & GE_SINGLE.Value) ===> int
ve diğer parçası mantıklıdır:
(!GE_DUAL.Value & !IN_TMR.Value) ===> bool
bütün çizgi dolaylı int döküm şöyle ki:
(GE_DUAL.Value & GE_SINGLE.Value) | (!GE_DUAL.Value & !IN_TMR.Value)
{bool} != {{int} | {bool}};
{int} == {{int} | {bool}};
Cevabınız için teşekkür ederiz. Yeniden yazmanız hakkında bir sorum var: IN_TMR.Value'ye ne oldu? Cuma ait –
Ah üzgünüm uç derin bakmak ve her iki durumda da aynı değerlere kullanılan düşündüm vermedi. Kaldırılan – Slava