找回密码
 点一下
查看: 1178|回复: 26

[更正确的表述版][Union Bug]H2I和I2H的新方案~~

[复制链接]
发表于 2007-12-13 14:36:56 | 显示全部楼层 |阅读模式
http://hilton.vs.oiccam.com/showthread.php?t=98230

英语超级蹩脚的Troll-Brain同学给我们带来的一种新的H2I和I2H方案~~并非旧的Return Bug~~于是我们叫它Union Bug~~

[codes=jass]
globals
    handle H
    integer I
endglobals
[/codes]

[codes=jass]
function Trig_test_Actions takes nothing returns nothing
local integer I
local handle H
set H = GetTriggerUnit()
call BJDebugMsg(I2S(I))
endfunction
[/codes]

这两段代码组合后~~触发动作显示在屏幕上的是什么呢?~~0?~

错了~~是触发单位的Handle值~~

很难以置信~~不是嘛?~~


但是当全局变量和局部变量同名时~~jass的覆盖就会出现问题~~

每执行一次对被覆盖的变量的赋值之后~~当前变量被赋予的值也同时会被无视类型地赋给本函数内其余的被覆盖变量

也就是说~~在这个函数里~~GetTriggerUnit() 不但被赋给了H~~也被赋给了I~~
发表于 2007-12-13 15:06:44 | 显示全部楼层
555。不过个人认为使用起来不够方便,如果达到的效果是一样的话。
回复

使用道具 举报

 楼主| 发表于 2007-12-13 15:15:07 | 显示全部楼层
这个明显更快~~

而且在某些时候很有用~~你看不出来嘛?~~
回复

使用道具 举报

发表于 2007-12-13 15:20:41 | 显示全部楼层
某些地方是指哪些?
回复

使用道具 举报

 楼主| 发表于 2007-12-13 15:24:51 | 显示全部楼层
在一次进行大量转换的时候你不需要一次次地调用H2I()函数~~
明显方便多了~~而且也极其方便GUI化~~

下面这个触发里只出现了2个Custom script~~其余全部可以用GUI搞定~~
你用return能这么方便么?~~

当然最重点的还是速度快多了~~因为不需要一次次通过另一个函数H2I()~~

看这里

[trigger]
Sample
    Events
        Player - Player 1 (Red) skips a cinematic sequence
    Conditions
    Actions
        Custom script:   local integer udg_i
        Custom script:   local unit udg_u
        Set u = 圣骑士0000 <gen>
        Debug - Debug (String(i))
        Set u = 大法师0004 <gen>
        Debug - Debug (String(i))
        Set u = 城镇大厅 0015 <gen>
        Debug - Debug (String(i))
[/trigger]
回复

使用道具 举报

发表于 2007-12-13 15:32:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-13 15:48:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-12-13 15:53:32 | 显示全部楼层
看明白了再发言质疑~~
回复

使用道具 举报

发表于 2007-12-13 16:02:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-13 16:04:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-12-13 16:06:31 | 显示全部楼层
你不觉得他说的BUG和这个BUG正是一回事么~~
回复

使用道具 举报

发表于 2007-12-13 16:07:53 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-12-13 16:09:29 | 显示全部楼层
很好~~你用return bug便不会程序崩溃~~是么?~~

那是你没遇到过错误值~~
回复

使用道具 举报

发表于 2007-12-13 16:10:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-12-13 16:11:48 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-12-13 16:40:46 | 显示全部楼层
这个也可以写成H2I的函数形式~~

function H2I takes handle h2 returns integer
    local integer i
    local handle h=h2
    return i
endfunction


不过这样写就比以前那种来得长了~~就没有优势了~~


它的另外一个好处是一个函数里可以同时转换多种类型~~这里就在一个函数内同时转换了单位、实数、布尔~~

[trigger]
Sample2
    Events
        Player - Player 1 (Red) skips a cinematic sequence
    Conditions
    Actions
        Custom script:   local integer udg_i
        Custom script:   local unit udg_u
        Custom script:   local real udg_r
        Custom script:   local boolean udg_b
        Set u = 圣骑士 0000 <gen>
        Debug - Debug (String(i))
        Set r = 123.23
        Debug - Debug (String(i))
        Set b = True
        Debug - Debug (String(i))
[/trigger]

但是string类型不能和其他类型一起转换~~只能自己用一个函数转换~~
也就是说~~你不能在同一个函数里用这个法子同时转换real和string(在不通过函数实现的前提下)~~否则便会崩溃~~而在同一个函数内转换多个string也是允许的~~
回复

使用道具 举报

 楼主| 发表于 2007-12-13 16:42:57 | 显示全部楼层
以上就是目前我对这个东西的测试的全部结果了~~
回复

使用道具 举报

发表于 2007-12-13 16:45:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2007-12-13 16:51:19 | 显示全部楼层
知足吧~~用return bug在一个函数中转换多种类型~~或是转换多个对象~~都是完全不可做到的~~

因为return注定了只能return一个值~~
回复

使用道具 举报

发表于 2007-12-13 16:53:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 09:17 , Processed in 0.084902 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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