Project1

标题: 检错方法【控制变量】、【中值定理】、【对照试验】 [打印本页]

作者: Vortur    时间: 2016-5-19 13:59
标题: 检错方法【控制变量】、【中值定理】、【对照试验】
本帖最后由 Vortur 于 2016-8-23 16:14 编辑

【RM的排错方法】


一、对照实验法
二、控制变量法
三、中值定理
四、拓展
五、多余的话






  

作者: RyanBern    时间: 2016-5-19 19:12
不要走上民科之路。
作者: zaiy2863    时间: 2016-5-19 19:17
克总表示你成功地降低了他的san值
因此就不给你发糖了
作者: yang1zhi    时间: 2016-5-19 21:57
道理我都懂,用这种书面法来说,感觉想睡觉
作者: 寒冷魔王    时间: 2016-5-22 13:04
本帖最后由 寒冷魔王 于 2016-5-22 13:10 编辑

鉴于LZ是在查找BUG,我来说一下最常见的BUG——脚本冲突的解决方法:

有四段脚本:
RUBY 代码复制
  1. # 脚本0
  2. class A
  3.   def a
  4.     puts("A.a0")
  5.   end
  6.   def b
  7.     puts("A.b0")
  8.   end
  9. end
RUBY 代码复制
  1. # 脚本1
  2. class A
  3.   alias old_a a  # 可以正常运行的写法
  4.   def a
  5.     old_a # a0有效
  6.     puts("A.a1")
  7.   end
  8.   def b # 可能出于需要,作者有意覆盖原本的b脚本,这可能会导致后续用到原始b的脚本冲突
  9.         # 修改此问题的方法是将这段脚本放在其他修改脚本的上方,或者用if将它包装,或者将其他脚本对照着复制一遍(按照作者的写法适当修改)
  10.     puts("A.b1")
  11.   end
  12. end
RUBY 代码复制
  1. # 脚本2
  2. class A
  3.   alias old_a a # 错误根源:alias重命名为同一个名称导致循环调用
  4.                       # 修改方法:将这个old_a改成其他的名称,如old_old_a
  5.   def a # 和脚本1放在一起,会stack level too deep
  6.     old_a  # 这个要改成和本段脚本alias同样的名称
  7.     puts("A.a2")
  8.   end
  9.   alias old_b b
  10.   def b
  11.     old_b
  12.     puts("A.b2")
  13.   end
  14. end
RUBY 代码复制
  1. # 调用脚本
  2. a = A.new
  3. a.a
  4. puts("-")
  5. a.b


脚本0是原始脚本,脚本1是增添脚本1,脚本2是增添脚本2。

顺序:

【0】
脚本0
正确,输出
A.a0
A.b0

【1】
脚本0
脚本1
脚本2

错误1:
in `a': stack level too deep (SystemStackError)

检查名称为a的函数,看看alias是否将两个a函数重命名为同一个a函数
如两个alias old_a a。
有,改为不同名,如:
alias old_a1 a
alias old_a2 a
注意各自a函数里的调用也要改。

错误2:
改完后,输出
A.a0
A.a1
A.a2
-
A.b1
A.b2
如果b0是我们不需要的,那么就是正确结果,如果需要的话,那么需要在脚本2中调用原本的b
直接将脚本2放在脚本1上方,是不行的。因为这样的话只会输出b1。
修改这一问题的方法是在脚本0的b函数后面加一条alias:
RUBY 代码复制
  1. #(脚本0)
  2.   def b
  3.     puts("A.b0")
  4.   end
  5.   alias default_b b
  6.  
  7. #(脚本2)
  8.   def b
  9.     default_b # 这个是为b0准备的
  10.     old_b     # 这个是为b1以及基于b1修改的各种脚本准备的
  11.     puts("A.b2")
  12.   end



【2】
脚本0
脚本2
脚本1

修改好stack错误后,会发现只输出b1。
这是因为b1粗暴地将原本的代码全部覆盖了(其实这个很多时候是作者不得不这么做的)
解决方法之一是调整顺序(见上)。
如果不想调整顺序,或者调整顺序依旧出现很多问题的话,就需要按照代码的逻辑进行修改。
将多个重载函数合成为一个函数,通过if case等语句控制,是一个比较好的方法。




许多兼容性问题,其实根源大抵都是这种重载问题。
当然还有使用同一个变量导致冲突之类。
理解增添脚本的修改内容,根据情况适当调整,是万能的解决方案。

作者: 我是大仙    时间: 2016-5-22 13:41
检错方法【找到错误代码的位置,仔细核对是否有拼写或语法错误,如果没有,重申全代码】
作者: summer92    时间: 2016-5-23 20:13
你是说断点?
作者: b565185756    时间: 2016-5-26 10:57
到底要不要和我合为一体!!!
作者: vixv    时间: 2018-10-16 02:00
楼主你好,我已经照着你的输入来了,能进游戏了,但是进去菜单栏还是会黑屏出现堆栈过深错误。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1