Çözüldü game warning [-Wsign-compare] [-Wmaybe-uninitialized]

Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

ofv014

Üye
Üye
Mesaj
39
Çözümler
4
Beğeni
17
Puan
424
Ticaret Puanı
0
Merhaba arkadaşlar,
Filesimdeki warninglerin birçoğunu @Whistle 'ın warning çözümü videolarından destek alarak ve warezdeki fileslerin dosyalarıyla karşılaştırma yaparak çözdüm.
Sadece 2 adet kaldı. Onlar da gördüğüm kadarıyla sonradan eklenen guild flag fix'i ve uzaktan npc sistemindeki kodlardaki hatalardan kaynaklanıyor.

warningler:
char_state.cpp: In member function 'void {anonymous}::FuncFindChrForFlagBase::operator()(LPENTITY)':
char_state.cpp:151:38: warning: comparison of integer expressions of different signedness: 'DWORD' {aka 'unsigned int'} and 'long int' [-Wsign-compare]
  151 |         m_pkChr->GetGuild()->GetID() != pkAff->lApplyValue)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
shop_manager.cpp: In member function 'bool CShopManager::NPCAC(LPCHARACTER, LPCHARACTER, int)':
shop_manager.cpp:117:2: warning: 'pkShop' may be used uninitialized in this function [-Wmaybe-uninitialized]
  117 |  if (!pkShop)
      |  ^~

Warning aldığım satırların bulduğu kodların tamamı ise şu şekilde;
char_state.cpp:
class FuncFindChrForFlagBase
    {
        public:
            FuncFindChrForFlagBase(LPCHARACTER pkChr) : m_pkChr(pkChr)
            {
            }

            void operator () (LPENTITY ent)
            {
                if (!ent->IsType(ENTITY_CHARACTER))
                    return;

                if (ent->IsObserverMode())
                    return;

                LPCHARACTER pkChr = (LPCHARACTER) ent;

                if (!pkChr->IsPC())
                    return;

                CGuild * pkGuild = pkChr->GetGuild();

                if (!pkGuild)
                    return;

#ifdef ENABLE_GUILD_FLAG_FIX
                if (!m_pkChr || !m_pkChr->IsPC() || !m_pkChr->GetGuild())
                    return;
#endif

                int iDist = DISTANCE_APPROX(pkChr->GetX()-m_pkChr->GetX(), pkChr->GetY()-m_pkChr->GetY());

                if (iDist <= 500 &&
                        (pkChr->IsAffectFlag(AFF_WAR_FLAG1) ||
                         pkChr->IsAffectFlag(AFF_WAR_FLAG2) ||
                         pkChr->IsAffectFlag(AFF_WAR_FLAG3)))
                {
                    CAffect * pkAff = pkChr->FindAffect(AFFECT_WAR_FLAG);

#ifdef ENABLE_GUILD_FLAG_FIX
                    sys_log(0, "FlagBase %s dist %d aff %p flag gid %d chr gid %u",
                            pkChr->GetName(), iDist, pkAff,
                            m_pkChr->GetGuild()->GetID(), pkChr->GetGuild()->GetID());

                    if (pkAff)
                    {
                        if (m_pkChr->GetGuild()->GetID() == pkGuild->GetID() &&
                                m_pkChr->GetGuild()->GetID() != pkAff->lApplyValue)
#else
                    sys_log(0, "FlagBase %s dist %d aff %p flag gid %d chr gid %u",
                            pkChr->GetName(), iDist, pkAff, m_pkChr->GetPoint(POINT_STAT),
                            pkChr->GetGuild()->GetID());

                    if (pkAff)
                    {
                        if ((DWORD) m_pkChr->GetPoint(POINT_STAT) == pkGuild->GetID() &&
                                m_pkChr->GetPoint(POINT_STAT) != pkAff->lApplyValue)
#endif
                        {
                            CWarMap * pMap = pkChr->GetWarMap();
                            BYTE idx;

                            if (!pMap || !pMap->GetTeamIndex(pkGuild->GetID(), idx))
                                return;

                            //if (pMap->IsFlagOnBase(idx))
                            {
                                BYTE idx_opp = idx == 0 ? 1 : 0;

#ifdef ENABLE_GUILD_FLAG_FIX
                                SendGuildWarScore(m_pkChr->GetGuild()->GetID(), pkAff->lApplyValue, 1);
#else
                                SendGuildWarScore(m_pkChr->GetPoint(POINT_STAT), pkAff->lApplyValue, 1);
#endif
                                //SendGuildWarScore(pkAff->lApplyValue, m_pkChr->GetPoint(POINT_STAT), -1);

                                pMap->ResetFlag();
                                //pMap->AddFlag(idx_opp);
                                //pkChr->RemoveAffect(AFFECT_WAR_FLAG);

                                char buf[256];
                                snprintf(buf, sizeof(buf), LC_TEXT("%s 길드가 %s 길드의 깃발을 빼앗았습니다!"), pMap->GetGuild(idx)->GetName(), pMap->GetGuild(idx_opp)->GetName());
                                pMap->Notice(buf);
                            }
                        }
                    }
                }
            }

            LPCHARACTER m_pkChr;
    };

shop_manager.cpp:
#ifdef ENABLE_UZAKTAN_NPC_SISTEMI
bool CShopManager::NPCAC(LPCHARACTER pkChr, LPCHARACTER pkChrShopKeeper, int iShopVnum)
{
    if (pkChr->GetShopOwner() == pkChrShopKeeper)
        return false;
    
    if (pkChr->IsOpenSafebox() || pkChr->GetExchange() || pkChr->GetMyShop() || pkChr->IsCubeOpen())
    {
        pkChr->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("다른 거래창이 열린상태에서는 상점거래를 할수 가 없습니다."));
        return false;
    }

    LPSHOP pkShop;
    
    if (iShopVnum)
        pkShop = Get(iShopVnum);
    
    if (!pkShop)
    {
        sys_log(1, "SHOPAC: pkShop yok");
        return false;
    }
    if (!iShopVnum)
    {
        sys_log(1, "SHOPAC: iShopVnum yok");
        return false;
    }

    bool bOtherEmpire = false;

    pkShop->AddGuest(pkChr, pkChrShopKeeper->GetVID(), bOtherEmpire);
    pkChr->SetShopOwner(pkChrShopKeeper);
    sys_log(0, "SHOPAC: START: %s", pkChr->GetName());
    return true;
}
#endif

Çözüm konusunda yardımcı olacak arkadaşlara şimdiden teşekkürler :)
 
Çözüm
Evet orada bu hataların çözüm yöntemini gösterdim. Öğrendiklerinizden yola çıkarak bunları çözebilirsiniz. Eğer anlamadığınız kısımlar varsa sorabilirsiniz

Birinci sign-compare hatasının sebebi veri tipleri farklı olduğu için. Warning verse bile karşılaştırmayı doğru yapatacaktır. İsterseniz makefile'ye şunu ekleyerek gizleyebilirsiniz -Wno-sign-compare

İkinci de ise;
C++:
    LPSHOP pkShop;
 
    if (iShopVnum)
        pkShop = Get(iShopVnum);
 
    if (!pkShop)
    {
        sys_log(1, "SHOPAC: pkShop yok");
        return false;
    }

LPSHOP pkShop; tanımlanmış ancak herhangi bir veri atanmamış. Sadece iShopVnum gelirse tanımlanmış. Şu şekilde değiştirip deneyebilir misiniz?
C++:
    LPSHOP pkShop = NULL;
 
    if (iShopVnum)...
Evet orada bu hataların çözüm yöntemini gösterdim. Öğrendiklerinizden yola çıkarak bunları çözebilirsiniz. Eğer anlamadığınız kısımlar varsa sorabilirsiniz

Birinci sign-compare hatasının sebebi veri tipleri farklı olduğu için. Warning verse bile karşılaştırmayı doğru yapatacaktır. İsterseniz makefile'ye şunu ekleyerek gizleyebilirsiniz -Wno-sign-compare

İkinci de ise;
C++:
    LPSHOP pkShop;
 
    if (iShopVnum)
        pkShop = Get(iShopVnum);
 
    if (!pkShop)
    {
        sys_log(1, "SHOPAC: pkShop yok");
        return false;
    }

LPSHOP pkShop; tanımlanmış ancak herhangi bir veri atanmamış. Sadece iShopVnum gelirse tanımlanmış. Şu şekilde değiştirip deneyebilir misiniz?
C++:
    LPSHOP pkShop = NULL;
 
    if (iShopVnum)
        pkShop = Get(iShopVnum);
 
    if (!pkShop)
    {
        sys_log(1, "SHOPAC: pkShop yok");
        return false;
    }
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst