找回密码
 点一下
查看: 1607|回复: 11

关于jass的两个小问题?

[复制链接]
发表于 2014-4-15 11:33:37 | 显示全部楼层 |阅读模式
1 local string  需要不需要排泄?是不是无法排泄?

比如:
function x takes nothing returns string
local string s = "a"
return  s
endfunction
这样的函数中,如果在return之前set s=null 的话,无法正确return到s的值,如果在return之后set  s= null的话,是无法执行到这条命令
那么local sring 到底是不是一个指针呢?如果是的话,一旦使用就无法排泄了么?

2 用function 、hastable、全局变量数组 来做一个编译器的话,哪一种效果更好?

因为没学过编程,可能我说的不太明白,举个例子来说吧:
假如我要从物编的某些整型数值中读取出我设定的物品类型,其中:1代表剑 2代表盾 等等,那么我需要一个可以把整数换成对应字符串的编译器。

用function的话:
function a takes integer i returns string
if i == 1 then
returns "剑"
endif
if i == 2 then
returns "盾"
endif
return null
endfunction

用hastalbe的话:
globle
hashtable HT = InitHashtable()
globle

function main takes nothing returns nothing
call SaveStr(ht,0,1,"剑")
call SaveStr(ht,0,2,"盾")
endfunction

function b takes integer i returns string
return LoadStr(ht,0,i)
endfunction

用全局变量数组的话
globle
string array label
globle

function main takes nothing returns nothing
set lable[1]="剑"
set lable[2]="盾"
endfunction

function c takes integer i returns string
return lable[i]
endfunction

这三种方法哪一种执行起来效果会更好一点?







发表于 2014-4-15 18:55:09 | 显示全部楼层
1. string类型不需要set null, 不需要排泄, 也没办法排泄

2. 用if来返回值绝对是最笨的方法;
全局变量效率更高且在某些情况下更方便;
哈希表更通用, 但是必须在1.24下使用(不是大问题, 可用缓存代替)

点评

谢谢。 请问下function有办法用这种方法来索引么?我看Load/Save里没有关于function的项目。。。 比如我要做很多个技能的模拟,在单位技能生效事件后,判断单位释放的技能来执行对应的function达到模拟效果。 那  详情 回复 发表于 2014-4-18 13:54
回复

使用道具 举报

 楼主| 发表于 2014-4-18 13:54:48 | 显示全部楼层
希瓦 发表于 2014-4-15 18:55
1. string类型不需要set null, 不需要排泄, 也没办法排泄

2. 用if来返回值绝对是最笨的方法;

谢谢。
请问下function有办法用这种方法来索引么?我看Load/Save里没有关于function的项目。。。
比如我要做很多个技能的模拟,在单位技能生效事件后,判断单位释放的技能来执行对应的function达到模拟效果。
那么这种情况下有没有方法可以将function和技能id之间建立索引来简化代码?
我目前还是只能用if的笨方法一个一个判断 - -b
回复

使用道具 举报

发表于 2014-4-18 17:09:39 | 显示全部楼层
"将function和技能id之间建立索引"
这是什么意思?
是想用id来当函数的参数吗?

点评

恩。。。。我表达能力还是有问题,举例来说可能好点: 假如我有2个需要模拟的技能,外壳技能分别是a b,这两个技能索要达到的效果用funtion a 和funtion b来实现。 触发器: 事件 :单位释放技能生效 条件  详情 回复 发表于 2014-4-18 22:16
回复

使用道具 举报

 楼主| 发表于 2014-4-18 22:16:08 | 显示全部楼层
希瓦 发表于 2014-4-18 17:09
"将function和技能id之间建立索引"
这是什么意思?
是想用id来当函数的参数吗?

恩。。。。我表达能力还是有问题,举例来说可能好点:

假如我有2个需要模拟的技能,外壳技能分别是a b,这两个技能索要达到的效果用funtion a 和funtion b来实现。
触发器:

事件 :单位释放技能生效
条件 :null
动作 :
if 释放技能==a  then
call funciton a()
return
endif
if 释放技能== b then
call funciton b()
return
endif

如果技能很多的话,就像上面这样,用了最笨if一个一个的判断到底释放的是什么技能,再去使用对应的funciton来达到技能效果,非常繁琐,效率也低。

我想如果能把funtion a 和function b也存进hastable中,用外壳技能a 和b 的ID来做子类别索引,然后在触发时只需要用释放技能的id作为索引就能从hastable中读取出对应的function来执行,从而实现技能效果。但是好像function 这个东西本身不能存到hastable中去,好像也不能用指针来指定。

除了hastable之外,有没有其他方法可以把一些列动作命令合并在一起作为一个块,然后为其建立一个索引,通过索引可以直接指向这个块来执行其中的所有命令,而不是用if 一个一个去判断?

不知道我把我的意思表达清楚没有。。。。- -b

点评

<_<  发表于 2014-4-18 22:30
回复

使用道具 举报

发表于 2014-4-18 22:29:39 | 显示全部楼层
哈希表没办法存code, 但是你可以存函数名(string)
然后call ExecuteFunc("函数名") //调用函数

或者你可以创建一个trigger, 使用该函数作为action
然后TriggerExecute执行trigger

点评

哦,原来有executefunc这个命令,那就好办多了,可以直接建立索引了。 之前不知道有这么一条指令。不错,谢谢了。trigger就算了,写起来太麻烦,还是用function轻松点。 不过executefunc调用的函数能不能传递数  详情 回复 发表于 2014-4-18 23:00
回复

使用道具 举报

 楼主| 发表于 2014-4-18 23:00:09 | 显示全部楼层
希瓦 发表于 2014-4-18 22:29
哈希表没办法存code, 但是你可以存函数名(string)
然后call ExecuteFunc("函数名") //调用函数

哦,原来有executefunc这个命令,那就好办多了,可以直接建立索引了。
之前不知道有这么一条指令。不错,谢谢了。trigger就算了,写起来太麻烦,还是用function轻松点。

不过executefunc调用的函数能不能传递数据?还是说只能调用takes nothing的函数?
回复

使用道具 举报

发表于 2014-4-19 13:27:19 | 显示全部楼层
aboo 发表于 2014-4-18 23:00
哦,原来有executefunc这个命令,那就好办多了,可以直接建立索引了。
之前不知道有这么一条指令。不错 ...

executefunc只能takes nothing
回复

使用道具 举报

发表于 2014-4-23 01:43:46 | 显示全部楼层
1.不需要
2.数组
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 08:45 , Processed in 0.310885 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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