找回密码
 点一下
楼主: 938

JASS中一未知BUG(传说中由RPWT引发的BUG)

  [复制链接]
发表于 2008-1-23 22:18:06 | 显示全部楼层
。。。那个。。。gif勒?
回复

使用道具 举报

发表于 2008-1-24 12:14:28 | 显示全部楼层
以上经过测试,大家可以去试一下. 删除触发条件最好在函数传回真假以后.

今天做了很多测试,基本上搞懂了出错的原因:在同个触发器中,不能直接用条件动作来删除该条件。 否则会出错(这个有点奇怪,删除触发器没有事,删条件就有事了)

根据我的分析, 应该是条件动作没有返回真假值之前,一直处于运行状态,如果直接在没有返回真假值之前就给触发器移除条件,这就相当于你在吃饼的时候,突然咽住了一样(就是内存冲突)

所以,我们必须在条件返回真假值之后(就是用计时器延时删除)这样就不会出错了。

其时这个BUG有些小白了,犯了一些逻辑上的错误而已。
回复

使用道具 举报

发表于 2008-1-24 12:51:01 | 显示全部楼层
楼上滴说法偶比较认同。
其实偶一直不理解为啥要删除条件。

删除条件的出现,其实个人认为是便于动态增减条件,让触发器可以组合不同的条件而用。
当然,在删除的时候也许会清掉占用的内存。但是,这不应该成为主要的使用原因。
这大概能说明为啥条件可以删除,而动作不行。
回复

使用道具 举报

 楼主| 发表于 2008-1-24 14:32:23 | 显示全部楼层
请LS两位看清楚我问的问题好不好

我问的是,为何加了个没有用的call BJDebugMsg(I2S(0))后,游戏就不会出错

同样是“直接在没有返回真假值之前就给触发器移除条件”,但加了call BJDebugMsg(I2S(0))后就不会引起程序崩溃
回复

使用道具 举报

发表于 2008-1-24 14:39:55 | 显示全部楼层
你还真不是一般的小白啊。
为什么太阳从东边升起来,而不是西边呢?
回复

使用道具 举报

 楼主| 发表于 2008-1-24 14:50:38 | 显示全部楼层
因为你没有在金星上看日落
回复

使用道具 举报

 楼主| 发表于 2008-1-24 15:50:11 | 显示全部楼层
测试了下  的确是这样

触发器条件在销毁前  必须返回值(或者说必须执行完条件里的动作)

为何销毁触发器不会出错呢  因为触发器即便被销毁  也会执行一次  同样的道理  在触发器动作上也适用

还有一点  提到线程  call 函数的执行是窜行的  触发器、Timer和ExecuteFunc等执行是并行的  因此  call 函数中执行的函数   也被看做是条件中的一部分   因此这函数中销毁条件   实际是在条件中销毁条件    条件在没有返回值前就被销毁

但使用Timer(其实也可用ExecuteFunc)后    线程关系是并行的  因此这样删除条件  Timer或ExecuteFunc执行的函数   不隶属于条件   它是在条件的外部销毁条件  所以不会出错

PS:feelerly你是对的,我之前的语气有点冲,可能在听到你说这BUG小白有点不高兴;当然,也希望老狼能振作起来,只要不涉及触发器条件的销毁,把动作写到函数里,仍旧是种很好的写法。
回复

使用道具 举报

发表于 2008-1-24 15:54:01 | 显示全部楼层
嗯啊,貌似问题解决咯~~
和气,和气呀~~
回复

使用道具 举报

 楼主| 发表于 2008-1-24 16:03:09 | 显示全部楼层
如果要解决这BUG       很简单    直接把条件换成动作就可以解决了

但   我是想知道    为何加入call BJDebugMsg(I2S(0))就能暂时延缓程序崩溃

唉   为何一直没人搞清我提的问题呢——我并不是想知道如何解决这BUG    我是想知道call BJDebugMsg(I2S(0))这没用的函数为什么能影响程序运行
回复

使用道具 举报

发表于 2008-1-24 16:28:20 | 显示全部楼层
引用第48楼938于2008-01-24 16:03发表的  :
如果要解决这BUG       很简单    直接把条件换成动作就可以解决了

但   我是想知道    为何加入call BJDebugMsg(I2S(0))就能暂时延缓程序崩溃

唉   为何一直没人搞清我提的问题呢——我并不是想知道如何解决这BUG    我是想知道call BJDebugMsg(I2S(0))这没用的函数为什么能影响程序运行

额………………那个我在jass区发的那个图上面,这句话是完全无效的,加与不加都是在最后一个农民触发后跳错啊~~
回复

使用道具 举报

 楼主| 发表于 2008-1-24 16:52:46 | 显示全部楼层
call BJDebugMsg(I2S(0))这个本来就没有用   它不会影响到程序运行   因此指望它能阻止程序崩溃是不可能

但如果不加   执行老狼的代码会程序会立刻崩溃

所以   完全没有道理可言    无法解释    所以是RPBug
回复

使用道具 举报

发表于 2008-1-24 16:55:27 | 显示全部楼层
这个………………这个………………
rprp~~
回复

使用道具 举报

发表于 2008-1-24 17:01:26 | 显示全部楼层
没有什么东西是“没有用”的。
不然就不会有BUG这种东西了。
偶这台机器没有cj和bj的脚本,看不了代码。。
好像印象中bjdebugmsg里面调用的显示文本有计时器。
也许这就像等待不能用在条件里一样。。
(当然,如果把等待放在条件里是游戏跳出,当偶没说过。因为偶从来没有用这种方式写过东西。)
回复

使用道具 举报

发表于 2008-1-24 17:03:41 | 显示全部楼层
贴出BJDebugMsg代码~~
[codes=jass]function BJDebugMsg takes string msg returns nothing
    local integer i = 0
    loop
        call DisplayTimedTextToPlayer(Player(i),0,0,60,msg)
        set i = i + 1
        exitwhen i == bj_MAX_PLAYERS
    endloop
endfunction[/codes]
回复

使用道具 举报

 楼主| 发表于 2008-1-24 17:08:44 | 显示全部楼层
BJDebugMsg使用到了计时器又能怎样呢     条件依旧是在尚未执行完动作就被删除

但奇怪的是   加了后就不会弹出

而在zhuzeitou的演示中   BJDebugMsg没有任何效果    加不加都会在最后弹出
回复

使用道具 举报

发表于 2008-1-24 17:09:41 | 显示全部楼层
hmm。好吧。我说得不是很清楚,是显示文本有持续时间。
如同楼上帖出来的一样。
不过同样不一定会是因为这个原因。

简单的说,由于进行的操作没有按照预计的方式进行,所以并没有对这样的情况进行处理,BUG就这么产生鸟。
SO,如同41楼的同学说的一样,如果没有照这种方式进行,出现的任何方式都可能导致出错。
回复

使用道具 举报

发表于 2008-1-24 17:12:53 | 显示全部楼层
如果您想要问“为什么会这样”这种问题,那么我个人认为,所有的答案都只可能是猜测,即使表面上找到的原因,但是如果并不知道WC3具体是怎么处理这些事情,就谈不上知道“原因”了。
未知的状况总是多过已知的事物。
回复

使用道具 举报

发表于 2008-1-24 21:03:52 | 显示全部楼层
看完这么多帖子...感觉amp大大 说话有点针对everguo...
回复

使用道具 举报

发表于 2008-1-24 21:22:07 | 显示全部楼层
噢噢。其实光看一个帖子就能明白这种事情了呀。

其实他挺光荣的。要知道他可是世界上唯一一个被偶针对的人呀。不管是网上还是网下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-10-1 19:19 , Processed in 0.032121 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表