※ [本文转录自 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