※ [本文轉錄自 Gossiping 看板 #1Pfw8CCA ]
作者: reinforce15 (可魯貝洛斯) 看板: Gossiping
標題: Re: [問卦] 寧寧雞寫程式時是用space還是tab縮排
時間: Thu Aug 31 13:43:38 2017
※ 引述《justwe5566 (傑士塔紗路的老公)》之銘言:
: 乳提
: 可愛的寧寧雞
: http://i.imgur.com/P5c7HIF.jpg
: 最近開始學寫程式
: 不知道寧寧雞縮排都用space還是tab
: 好想知道喔
: U咪U寧寧雞是space派還是tab派的八卦?
你好 我好 各位姆咪好
我是小光 http://i.imgur.com/1fhF9x3.jpg
我覺得她應該是用space吧
不過本光還是喜歡用快捷鍵一鍵縮排 讚
話說第二季好好看喔 那隻貓也好可愛
第二季 第09分第34秒處
http://i.imgur.com/35hXCjk.png
上圖是寧寧原本的code 把他轉OCR
//
void DestructibleActor::ReceiveDamage(float sourceDamage)
{
//
auto resolvedDamage = sourceDamage;
for (const auto& debuf:m_debufs)
{
resolvedDamage = debuf.ApplyToDamage(resolvedDamage);
m_currentHealth -= resolvedDamage
if (m_currentHealth <= 0.f)
{
m_currentHealth = 0.f;
DestroyMe();
}
}
}
而且寧寧說執行時會卡住
好 讓我們來看看問題出在哪
首先
請各位姆咪們先看到第37行 DestroyMe()
有沒有發現? 這個DestroyMe()只有在血條小於等於0時才會被call
再來請姆咪們看到第34行這裡
也就是說 如果當 m_currentHealth 小於等於 0.f時
會一直是true的狀態 而一直去重複執行DestroyMe()
但又因DestroyMe()之前已經被call過了
可能會造成記憶體沒有東西可以讓DestroyMe()消除
所以記憶體有可能會被違法存取
而導致系統不穩 最終當機
本光想到的解法是把 } 號移到這裡
像這樣
//
void DestructibleActor::ReceiveDamage(float sourceDamage)
{
//
auto resolvedDamage = sourceDamage;
for (const auto& debuf:m_debufs)
{
resolvedDamage = debuf.ApplyToDamage(resolvedDamage);
}
m_currentHealth -= resolvedDamage
if (m_currentHealth <= 0.f)
{
m_currentHealth = 0.f;
DestroyMe();
}
}
如此一來 既能把第30行的for 與第34行的if分離開來
不會重複去DestroyMe
又能把Damage丟到迴圈外
不過有點疑問的是...
這樣寫不會在編譯時就跳出警告 或就直接出錯嗎?
我在猜啦 可能造成遊戲卡死的原因不是只有這個
其他地方可能也有logic上的問題
還有寧寧的compiler左側那欄我怎麼看都沒References
這樣沒問題嗎
啊對 海子那個應該可以用Qt來做到
只是沒她的source code