找回密码
 点一下
查看: 3532|回复: 10

[已解决]关于参数的排泄..

[复制链接]
发表于 2011-2-11 17:24:53 | 显示全部楼层 |阅读模式
[jass]
function CreateUnitsForPlayer0 takes nothing returns nothing
      local player p = Player(0)
      local unit u
      local integer unitID
      local trigger t
      local real life
      set u = CreateUnit( p, 'hsor', 185.3, -1169.2, 39.211 )
endfunction
[/jass]

想问,这个函数里面的参数都不用清除吗? 如果是全局变量的话,是不是也可以不清除.....这些参数是函数自动清除吗?
      local player p = Player(0)
      local unit u
      local integer unitID
      local trigger t
      local real life
发表于 2011-2-11 18:07:10 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2011-2-11 21:35:26 | 显示全部楼层
先感谢LS.不过....恕我愚钝
你发的帖子链接.我还是看不太明白....擦汗...
我就再问两点
1.如我发帖的提问.假设我在函数A中用了10个参数.
在一个触发中用10个全局或者局部变量对应了10个参数后.然后调用函数A.
那么.我是否可以不用管这10个全局或局部的变量?
希望告诉我分别是全局和局部时是否要清除,怎么清除最好? 希望不吝赐教.谢谢.

2. 要清除一个被占用的内存.仅仅删除对应的变量还不够.还需要设定该变量为空.这样的认识对吗?

另外想问
自定义代码: set udg_loc = null
我想问问这个udg_loc 对应的是一个什么点?

在【环保大师】中看到的...如下
这个触发里面没有用变量记录创建的点,最后却用 自定义代码: set udg_loc = null (!!!)
我想问问这个有什么作用...还有就是null (!!!) 这个(!!!)又指的量是什么呢?...好奇...

Location
事件
单位 - 任意单位 死亡
条件
动作
单位 - 创建 1 个 步兵 给 玩家1(红色) 在 ((触发单位) 的位置) ,面向角度为 默认建筑朝向 度
点 - 清除 ((触发单位) 的位置)
自定义代码: set udg_loc = null (!!!)
回复

使用道具 举报

发表于 2011-2-12 10:19:24 | 显示全部楼层
war3中的内存释放机制貌似是这样的:
当一个对象被赋值到变量的时候,它的引用数就增加1,变量被设为空(null)或是重新赋值为其他对象时,这个引用数就减少1。
当一个对象被销毁,且引用数为0的时候,它将被从内存中释放,可以重新被利用(也就是排泄了……)
所以局部变量需要设为null
参数是不影响这个引用数的,所以不需要设为null
魔兽的变量分为两类:一类为数值类型变量(如整数,实数,字符串也可以算为特殊的一种)他们是不需要排泄的(字符串不能排泄);另一类是指针类型变量,就是指针变量需要排泄。
而如上面所说,每一次为变量赋值都会增加引用数。
所以局部变量和全局变量在用完后都应设置为空。
全局变量和局部变量一样,在使用后除非是被设置为空,否则魔兽并不会自动删除它们,它会一直占用内存用来指向一个错误数据,直至重新给它赋值(重新指向一个实例)。
但是区别在于,局部变量在过程结束之后就不能使用,而全局变量则可以反复使用。
所以局部变量(不包括数值)需要set null否则就会泄漏,全局变量则没有这个必要,除非占用空间极大而且不再会被使用,不然下次为它赋值的时候其实就达到了set null的作用。
①没看懂你所说的“对应”了10个参数是什么意思,参数不需要set null,全局变量没必要set null,局部指针变量才需要set null

②局部变量确实应该set null才能完成排泄

③使用“触发编辑器”创建的“自定义变量”都带有“udg_”的前缀,而udg_loc就是名为loc的自定义变量
回复

使用道具 举报

 楼主| 发表于 2011-2-12 14:50:34 | 显示全部楼层
如我所述
我有一个函数
function caodan takes unit a, real s returns nothing
call RemoveUnit  (a)
call TriggerSleepAction (s)
    //return
endfunction

然后我用一个T调用.
[trigger]未命名触发器 001
    事件
        单位 - 任意单位 死亡
    条件
    动作
        自定义代码:   local unit u=GetTriggerUnit()
        自定义代码:   call caodan (u,2)
        自定义代码:   set u = null
[/trigger]

其中这个 T中的 unit u  可以说是对应了takes unit a 吗?
我想问问这类 对应 参数 的变量.是否需要排泄?
回复

使用道具 举报

发表于 2011-2-12 17:15:41 | 显示全部楼层
unit u需要set null
unit a不需要set null

将一个变量作为参数使用并不影响这个变量,因为参数传递的只是变量储存的值,而不是它的内存地址。
而unit u作为一个局部变量,自然需要set null。
回复

使用道具 举报

 楼主| 发表于 2011-2-13 17:39:22 | 显示全部楼层
大致明白了.谢谢.辛苦了.

突然又出了个意外的问题

就是想问.
比如我用一个单位施放技能.用局部变量X记录了它.让它施放完以后,    call RemoveUnit(x)会把它干掉....但是我不能删除它...这时仅仅使用       set x = null 可以完成排泄吗?如果不能的话.那还有没有什么其它办法?
回复

使用道具 举报

发表于 2011-2-13 21:32:00 | 显示全部楼层
只要set null就行了……单位死亡尸体腐烂后,系统会自动删除这个单位。
回复

使用道具 举报

 楼主| 发表于 2011-2-15 14:16:28 | 显示全部楼层
抱歉.我又出了疑问.
我在使用一个局部整数变量  i  时.
在结尾时发现 我找不到 RemoveInteger 这样的清除 整数 的函数.
另外就是我用 set  i = null
jasshelper报错,说不能set i 为null,我想问问这个该怎么办.....
我想问问.是不是整数变量不用清除?
如果不是的话....应该怎么清除? 还有实数是不是也是如此呢?
希望解答.谢谢.
回复

使用道具 举报

发表于 2011-2-15 17:55:18 | 显示全部楼层
魔兽的变量分为两类:一类为数值类型变量(如整数,实数,字符串也可以算为特殊的一种;实际上“单位类型”“物品类型”其实就是“整数”的一种,看了JASS教程就知道了)他们是不需要排泄的(字符串不能排泄));另一类是指针类型变量,他们被用来储存指向具体对象的句柄值,就是这种指针变量需要排泄。(如:单位,计时器,特殊效果,漂浮文字,单位组,玩家组,多面板………………)
我在地板已经说过了吧……数值型变量不需要排泄
而且就算需要排泄也不能set null,因为null并不是一个数,类型都不匹配,当然不能用来给数值型变量赋值。(这也是为什么系统会报错:类型不匹配)

建议楼主再去看一下JASS的基础教程(可以在本区的置顶“JASS遗失的记忆”找)
然后再推荐一个工具:JASSCRAFT
回复

使用道具 举报

 楼主| 发表于 2011-2-15 21:56:45 | 显示全部楼层

回 9楼(希瓦) 的帖子

十分感谢 希瓦

也感谢诸位LS.
我再去好好看看基础...惭愧.
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 20:22 , Processed in 0.036021 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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