查看: 3350|回复: 20

[胡扯] 检错方法【控制变量】、【中值定理】、【对照试验】

[复制链接]
梦石
0
星屑
1297
在线时间
995 小时
注册时间
2014-12-14
回帖
2939

开拓者

发表于 2016-5-19 13:59:15 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 Vortur 于 2016-8-23 16:14 编辑

【RM的排错方法】


[fold=一、对照实验法]一、对照实验法

情形简述:
  某工程A在插入了脚本1之后,突然报错。
  求:是什么导致工程A出错?


实验过程:
  实验组:具备了脚本1的工程A (以新名称A1作为它的名字)  ——结果在实验前不可知
  对照组:不具备脚本1的工程A  (以新名称A0作为它的名字)  ——结果在实验前已可知
  变量:工程A是否插入了脚本1
  结果:不具备脚本1的工程A0,没有报错
  结论:经实验证明,当【工程A不具备脚本1】时,系统不会报错;因此,脚本1会使工程A出错,两者不兼容。


深入探讨:
  简言之就是【对比产生认知】
  拓展链接:【基础理论】



  [/fold][fold=二、控制变量法]二、控制变量法

情形简述:
  某工程A在插入了脚本1之后,突然报错。
  求:脚本1与工程中A中的什么不兼容?


实验过程:
  假设:脚本1可能与之前在工程A中插入的脚本2不兼容。
  实验组:具备脚本1,不具备脚本2的工程A1
  对照组:具备脚本2,不具备脚本1的工程A2
  变量:工程A是插入了脚本1,还是脚本2
  结果:工程A1与工程A2都未报错
  结论:经实验证明,...故脚本1与脚本2不兼容。


深入讨论:
  上例中,导致报错的原因,可能还会是“不小心删除了预设脚本”、“素材丢失”等问题。而在两组实验中,仅让“插入脚本1还是脚本2”作为唯一的【不同】,就是“把多因素的问题变成多个单因素的问题,仅改变这一个因素,从而研究这个因素对事物影响”,这就是【控制变量法】。

提问:如果上述实验结果中,未出现【工程A1与工程A2都不报错】的结果,又该得出什么结论?可能的其他实验结果有哪些?



  [/fold][fold=三、中值定理]三、中值定理

情形简述:
  很久前坑了的工程A,今天填坑的时候突然报错。
  求:是什么导致工程A出错?


实验过程:
  假设:可能某插件脚本所致。
  情报:该工程共插入了  脚本1~脚本9  共九个脚本

3.1穷举法:
  逐一删除插件脚本,并测试游戏,直到游戏不再报错为止。


3.2中值定理:

  1.9/2,约为5
  2.删除脚本1~5,测试游戏
  3.若仍报错,删除脚本6~9,测试游戏
  4.若仍报错,则重复1.~3.的步骤  (剩下6~9共四个脚本:【3/2约为2】→【删除脚本6、7,测试】→【若报错,删除8、9测试】...)


深入讨论:
  中值定理的好处是,将变量们等分为两类,迅速判断其出错的1/2位于何处。



  [/fold]
[fold=四、拓展]四、拓展
1.  变量
  本教程中的“变量”,不是指【脚本中的变量】,而是指【某bug出现的原因】:因为可以人为控制这种原因出现与否,故可称为变量。——别笑,在下就见过有人不理解。

2.  一些情况中,
  1)  独立变量:  一个变量的改变不会引起其他变量的改变。
  2)  非独立变量:  一个变量的改变会引起其他变量的改变。
  3)  两个变量共同作用,产生一个结果。



  [/fold][fold=五、多余的话]五、多余的话
  如果还不明白,控制变量法、对照实验法是初中理科(生物、化学、物理)的知识点,中值定理是高中数学的知识点,请【认真】听你老师的讲课。



  [/fold]





  

评分

参与人数 4星屑 +20 收起 理由
3535 + 17 哈哈
RaidenInfinity + 1 只能给87分不能再多了
david_ng223 + 1 我不赞同
VIPArcher + 1 我很不赞同

查看全部评分

【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.

寒

梦石
0
星屑
1049
在线时间
1391 小时
注册时间
2010-8-9
回帖
3301
发表于 2016-5-22 13:04:50 | 显示全部楼层
本帖最后由 寒冷魔王 于 2016-5-22 13:10 编辑

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

有四段脚本:
[pre lang="ruby"]# 脚本0
class A
  def a
    puts("A.a0")
  end
  def b
    puts("A.b0")
  end
end[/pre][pre lang="ruby"]# 脚本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[/pre][pre lang="ruby"]# 脚本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[/pre][pre lang="ruby"]# 调用脚本
a = A.new
a.a
puts("-")
a.b[/pre]

脚本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:
[pre lang="ruby"]#(脚本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[/pre]


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

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




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

点评

脚本冲突的最好解决办法是重构!【大雾  发表于 2016-5-22 15:25

评分

参与人数 2星屑 +50 收起 理由
Vortur + 41 今天所有的糖,敬最认真的人!.
zaiy2863 + 9 6翻了,大大大大好评,克总给你发糖.

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2016-5-19 19:12:14 | 显示全部楼层
不要走上民科之路。

评分

参与人数 2星屑 +93 收起 理由
正太君 + 90 头像好评...
Vortur + 3 对那些需要这些姿势的人,何其忍!?.

查看全部评分

回复

使用道具 举报

梦石
0
星屑
121
在线时间
1914 小时
注册时间
2013-9-2
回帖
1593

剧作品鉴家

发表于 2016-5-19 19:17:48 | 显示全部楼层
克总表示你成功地降低了他的san值
因此就不给你发糖了

评分

参与人数 1星屑 +3 收起 理由
Vortur + 3 原帖链接在下就不发了,阁下自己看去.

查看全部评分

RM新人,尚在摸索熟悉软件中。对您的指教十分感谢。(鞠躬
RM的新手教程、新手教程和新手教程
喵雪大触的像素绘画教程
回复

使用道具 举报

梦石
0
星屑
12161
在线时间
4435 小时
注册时间
2014-4-11
回帖
5616

开拓者

发表于 2016-5-19 21:57:25 | 显示全部楼层
道理我都懂,用这种书面法来说,感觉想睡觉

点评

诚恳地为阁下高兴,因为阁下用不到此教程  发表于 2016-5-19 22:04
回复

使用道具 举报

梦石
0
星屑
5901
在线时间
1145 小时
注册时间
2013-7-8
回帖
1850

极短23参与

发表于 2016-5-22 13:41:36 | 显示全部楼层
检错方法【找到错误代码的位置,仔细核对是否有拼写或语法错误,如果没有,重申全代码】
回复

使用道具 举报

梦石
0
星屑
1547
在线时间
688 小时
注册时间
2009-11-11
回帖
2692
发表于 2016-5-23 20:13:39 | 显示全部楼层
你是说断点?

点评

绝对不是这个。-.-!  发表于 2016-5-24 00:08
代码民工用的东西  发表于 2016-5-23 20:54
不,应该不是。在下不清楚什么是断点。断点是什么呢?  发表于 2016-5-23 20:45
回复

使用道具 举报

梦石
0
星屑
4549
在线时间
1923 小时
注册时间
2010-8-16
回帖
786

短篇八RM组季军

发表于 2016-5-26 10:57:37 | 显示全部楼层
到底要不要和我合为一体!!!

点评

黑人问号  发表于 2016-9-5 20:54
只会点简单的事件脚本  发表于 2016-8-25 20:59
真假,会脚本吗!  发表于 2016-8-25 20:38
合体。  发表于 2016-8-24 18:56
合体!  发表于 2016-8-24 17:51
Steam页面:
http://store.steampowered.com/app/486850
https://store.steampowered.com/app/865180/
志同道合QQ&E-mail:707429539@qq.com
回复

使用道具 举报

梦石
0
星屑
704
在线时间
91 小时
注册时间
2018-9-30
回帖
43
发表于 2018-10-16 02:00:06 | 显示全部楼层
楼主你好,我已经照着你的输入来了,能进游戏了,但是进去菜单栏还是会黑屏出现堆栈过深错误。
想做一款 吞食天地2重制版 游戏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部