找回密码
 点一下
查看: 2148|回复: 30

在触发条件里面set trg=null导致魔兽弹出的原因

[复制链接]
发表于 2010-11-11 15:49:11 | 显示全部楼层 |阅读模式
如题,在一个触发条件中,set trg=GetTriggeringTrigger(),destroytrigger(trg),然后再加上set  trg=null 这句魔兽就弹出来了,如果不用局域变量的话,把trg全部换成GetTriggeringTrigger()的话一样会弹出,很奇怪。。。 。。。为什么set trg=null会导致弹出。。。
额。。找到了,,,原来我把trigger 的handle储存在timer上了,然后在trigger条件里面destroytrigger(本触发)只要加上set trg=null这一句就会出错。。。。 但是只要把记录trigger的哈希表给清了就没问题了。。。
发表于 2010-11-11 16:55:32 | 显示全部楼层
其实destorytrigger的时候就已经bug了
set null只是把handle释放掉用来放其他类型的东西了

你再做类似强制类型转换的动作就会弹框框了
回复

使用道具 举报

 楼主| 发表于 2010-11-11 18:33:53 | 显示全部楼层
沙发的意思是不可以在本触发条件里面删除本触发吗?现在的问题变成退出后弹出。。。。只要把set trg=null去掉又正常了。。。 这到底是怎么回事,有没有人给个关于弹错的心得。。。
回复

使用道具 举报

发表于 2010-11-11 18:49:01 | 显示全部楼层
在条件里 传递参数呗.......
[jass]
function xxx takes trigger trg returns nothing
call  DestroyTrigger(trg)                                                        
endfunction

call xxx(GetTriggeringTrigger())
[/jass]
回复

使用道具 举报

发表于 2010-11-11 19:00:08 | 显示全部楼层
引用第2楼frozenleave于2010-11-11 18:33发表的 :
沙发的意思是不可以在本触发条件里面删除本触发吗?现在的问题变成退出后弹出。。。。只要把set trg=null去掉又正常了。。。 这到底是怎么回事,有没有人给个关于弹错的心得。。。

呃 不是~~~

我的意思是说,强制把一个不是触发器类型的handle转换成触发器会弹框 就好比你非指着一个单位说:“这个是触发器!”
而一个handle位被释放后再次被利用的话,不知道会变成什么类型...
回复

使用道具 举报

 楼主| 发表于 2010-11-11 20:55:49 | 显示全部楼层
引用第4楼Conflux于2010-11-11 19:00发表的 :

呃 不是~~~

我的意思是说,强制把一个不是触发器类型的handle转换成触发器会弹框 就好比你非指着一个单位说:“这个是触发器!”
而一个handle位被释放后再次被利用的话,不知道会变成什么类型...
.......

哪里强制转换了呀 貌似只是用哈希表储存而已。。没有转换哦。。。
回复

使用道具 举报

发表于 2010-11-11 23:26:13 | 显示全部楼层
[jass]function B takes nothing returns nothing
local location loc
set loc=Location(0,0)
call SaveLocationHandle(udg_HT,0,0,loc)
//call RemoveLocation(loc)
// set loc=null
endfunction

function A takes nothing returns nothing
local location loc
set loc=Location(0,0)
call SaveLocationHandle(udg_HT,0,0,loc)
call RemoveLocation(loc)
set loc=null
//call B()  未出错
//call TimerStart(CreateTimer(),0,false,function A) 弹出
endfunction



//===========================================================================
function InitTrig____________________001_______u takes nothing returns nothing
local trigger trig
set trig = CreateTrigger(  )
call TriggerRegisterPlayerChatEvent(trig, Player(0), "1", true )
call TriggerAddAction( trig, function A )
set trig = CreateTrigger(  )
call TriggerRegisterPlayerChatEvent(trig, Player(0), "2", true )
call TriggerAddAction( trig, function B )
endfunction

// 问题果然在SaveXXXHandle那句 但不知为何多走个endfunction才会出错... [/jass]
我也不知道... 做了点实验 但没明白咋回事
初步怀疑可能因为endfunction时才会释放掉没有引用计数的死掉的handle
然后哈希表函数内部可能有一些强制转化的动作什么的... 最后导致当机吧?
回复

使用道具 举报

发表于 2010-11-12 10:44:26 | 显示全部楼层
引用第6楼Conflux于2010-11-11 23:26发表的 :
[jass]function B takes nothing returns nothing
local location loc
set loc=Location(0,0)
call SaveLocationHandle(udg_HT,0,0,loc)
//call RemoveLocation(loc)
.......

你这个错误是死循环了吧
回复

使用道具 举报

发表于 2010-11-12 16:34:03 | 显示全部楼层
哪..哪里有死循环了?!!
回复

使用道具 举报

 楼主| 发表于 2010-11-12 17:06:05 | 显示全部楼层
试试把计时器的时间间隔条成不是0看看。。。
回复

使用道具 举报

发表于 2010-11-12 17:12:38 | 显示全部楼层
引用第8楼core于2010-11-12 16:34发表的 :
哪..哪里有死循环了?!!

他说会弹出的那里

function A takes nothing returns nothing
local location loc
set loc=Location(0,0)
call SaveLocationHandle(udg_HT,0,0,loc)
call RemoveLocation(loc)
set loc=null
//call B()  未出错
//call TimerStart(CreateTimer(),0,false,function A) 弹出
endfunction
回复

使用道具 举报

 楼主| 发表于 2010-11-12 17:18:28 | 显示全部楼层
其实没有死循环,那个即使把时间改成1也会弹出来。
function B takes nothing returns nothing

local location loc

set loc=Location(0,0)

call SaveLocationHandle(udg_HT,0,0,loc)

call RemoveLocation(loc)

set loc=null

endfunction



function A takes nothing returns nothing

local location loc

set loc=Location(0,0)

call SaveLocationHandle(udg_HT,0,0,loc)

call RemoveLocation(loc)

call FlushChildHashtable(udg_HT,0) //************************加多这一句就不会弹出了,我的经验是如果要删除handle类型的数据就一定要把存储handle的表给毁了,顺便问一下在代码上面加什么前缀后缀可以高亮语法。。

set loc=null

//call B()  //未出错

call TimerStart(CreateTimer(),1,false,function A)// 弹出

call DisplayTextToPlayer(Player(0),0,0,"aa")

endfunction
//------------------------------------------------------------
function Trig_aa_Actions takes nothing returns nothing
local trigger trig
call DisplayTextToPlayer(Player(0),0,0,"aa")
set trig = CreateTrigger(  )

call TriggerRegisterPlayerChatEvent(trig, Player(0), "1", true )

call TriggerAddAction( trig, function A )

set trig = CreateTrigger(  )

call TriggerRegisterPlayerChatEvent(trig, Player(0), "2", true )

call TriggerAddAction( trig, function B )
endfunction

//===========================================================================
function InitTrig_aa takes nothing returns nothing
    set gg_trg_aa = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_aa, 0.00 )
    call TriggerAddAction( gg_trg_aa, function Trig_aa_Actions )
endfunction
回复

使用道具 举报

发表于 2010-11-12 18:05:29 | 显示全部楼层
Re: 10#
呃... 疏忽...

Re: 11#
清理掉哈希表自然没有了错误的handle让它强转了...
至于高亮嘛~~~
[jass]globals
string s = "hello world"
endglobals[/jass]
[jass]globals
string s = "hello world"
endglobals[/jass喵]
去掉喵
回复

使用道具 举报

发表于 2010-11-12 20:17:44 | 显示全部楼层
[jass]
function B takes nothing returns nothing

local location loc
local timer t = LoadTimerHandle(udg_HT, GetHandleId(GetExpiredTimer()),0)

set loc=Location(0,0)

call SaveLocationHandle(udg_HT,0,0,loc)

call RemoveLocation(loc)

if t!=null then
call PauseTimer(t)
call DestroyTimer(t)
call BJDebugMsg( "2" )
endif
set loc=null
set t=null
call BJDebugMsg( "1" )

endfunction


function A takes nothing returns boolean

local timer t = CreateTimer()
call DestroyTrigger(GetTriggeringTrigger())


call SaveTimerHandle(udg_HT,GetHandleId(t),0,t)

call B()

call TimerStart(t,0,false,function B)
set t=null
return false
endfunction

//===========================================================================
function InitTrig_x takes nothing returns nothing
local trigger trig

set trig = CreateTrigger( )

call TriggerRegisterPlayerChatEvent(trig, Player(0), "1", true )

call TriggerAddCondition( trig, Condition( function A ) )

set trig = CreateTrigger( )

call TriggerRegisterPlayerChatEvent(trig, Player(0), "2", true )

call TriggerAddAction( trig, function B )
endfunction

[/jass]
它竟然不报错 附图...........

蛋.w3x

17 KB, 下载次数: 6

回复

使用道具 举报

发表于 2010-11-12 21:09:37 | 显示全部楼层
咦?我也把6楼的TimerStart时间调长些居然没出错... 看来的确是因为死循环
6楼的推测是错误的...

问题也更诡异了...
回复

使用道具 举报

发表于 2010-11-12 21:14:20 | 显示全部楼层
弹出的情况目前貌似仅限于下面这个情况了... 玩家按下两次ESC之后 立刻当机

[jass]function A takes nothing returns nothing
local location loc
set loc=Location(0,0)
call SaveLocationHandle(udg_HT,0,0,loc)
call RemoveLocation(loc)
set loc=null
endfunction

function InitTrig____________________001_______u takes nothing returns nothing
local trigger trig
set trig = CreateTrigger(  )
call TriggerRegisterPlayerEventEndCinematic(trig, Player(0))
call TriggerAddAction( trig, function A ) //动作和条件的结果相同
endfunction[/jass]
回复

使用道具 举报

发表于 2010-11-12 21:26:19 | 显示全部楼层
我把A里面的 call DestroyTrigger(GetTriggeringTrigger()) 去掉 连续输入1没问题 连续输入2没问题........
难道是我手速不够........     APM只有5........
换事件还是没问题.......  
彻底的蛋疼了..........
l.jpg
回复

使用道具 举报

 楼主| 发表于 2010-11-12 21:27:06 | 显示全部楼层
就是说SaveHandle(xxxxx。。。。)如果里面储存有一个被删除了的Handle就会当机,,,哪个大神解释一下为虾米这样呢?
楼上的触发是初始运行的么?
回复

使用道具 举报

发表于 2010-11-12 21:33:43 | 显示全部楼层
删除了只会返回 null   就像直接输入2   去掉这个if t!=null then也没问题.......
13楼有图 下载自己试下.......
回复

使用道具 举报

 楼主| 发表于 2010-11-12 21:39:56 | 显示全部楼层
因为楼上每次调用都开启一个计时器作哈希表的父母钥匙,所以即使是删除了储存了的东西只要储存的时候只要不覆盖一个原本是储存着一个被删除掉的handle,就不会出错,所以只要handle被删除就立刻清空所在的哈希表就没问题了。楼上的函数直接输入“2”的话,那么GetExpiredTimer()应该是null把。。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-27 13:14 , Processed in 0.100530 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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