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——脚本冲突的解决方法:
有四段脚本:
# 脚本0
class A
def a
puts("A.a0")
end
def b
puts("A.b0")
end
end
# 脚本0
class A
def a
puts("A.a0")
end
def b
puts("A.b0")
end
end
# 脚本1
class A
alias old_a a # 可以正常运行的写法
def a
old_a # a0有效
puts("A.a1")
end
def b # 可能出于需要,作者有意覆盖原本的b脚本,这可能会导致后续用到原始b的脚本冲突
# 修改此问题的方法是将这段脚本放在其他修改脚本的上方,或者用if将它包装,或者将其他脚本对照着复制一遍(按照作者的写法适当修改)
puts("A.b1")
end
end
# 脚本1
class A
alias old_a a # 可以正常运行的写法
def a
old_a # a0有效
puts("A.a1")
end
def b # 可能出于需要,作者有意覆盖原本的b脚本,这可能会导致后续用到原始b的脚本冲突
# 修改此问题的方法是将这段脚本放在其他修改脚本的上方,或者用if将它包装,或者将其他脚本对照着复制一遍(按照作者的写法适当修改)
puts("A.b1")
end
end
# 脚本2
class A
alias old_a a # 错误根源:alias重命名为同一个名称导致循环调用
# 修改方法:将这个old_a改成其他的名称,如old_old_a
def a # 和脚本1放在一起,会stack level too deep
old_a # 这个要改成和本段脚本alias同样的名称
puts("A.a2")
end
alias old_b b
def b
old_b
puts("A.b2")
end
end
# 脚本2
class A
alias old_a a # 错误根源:alias重命名为同一个名称导致循环调用
# 修改方法:将这个old_a改成其他的名称,如old_old_a
def a # 和脚本1放在一起,会stack level too deep
old_a # 这个要改成和本段脚本alias同样的名称
puts("A.a2")
end
alias old_b b
def b
old_b
puts("A.b2")
end
end
# 调用脚本
a = A.new
a.a
puts("-")
a.b
# 调用脚本
a = A.new
a.a
puts("-")
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:
#(脚本0)
def b
puts("A.b0")
end
alias default_b b
#(脚本2)
def b
default_b # 这个是为b0准备的
old_b # 这个是为b1以及基于b1修改的各种脚本准备的
puts("A.b2")
end
#(脚本0)
def b
puts("A.b0")
end
alias default_b b
#(脚本2)
def b
default_b # 这个是为b0准备的
old_b # 这个是为b1以及基于b1修改的各种脚本准备的
puts("A.b2")
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 |