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

一个动态变量系统

[复制链接]
发表于 2007-1-28 02:58:31 | 显示全部楼层 |阅读模式
做这个东西又把我郁闷鸟
原因是这个思路是我最开始学jass的时候就想出来的
直到现在才写了出来
哎~做人还是踏实点好
[jass]
globals
    integer array udg_dataV
    integer array udg_linkV
endglobals
//===下面是功能代码===
function S2H takes string  s  returns handle
    return s
    return null
endfunction
function H2S takes handle  h  returns string
    return h
    return null
endfunction
function I2H takes integer i  returns handle
    return i
    return null
endfunction
function H2I takes handle  h  returns integer
    return h
    return 0
endfunction
function InitV takes  nothing returns nothing
    set udg_dataV[0] = 0
    set udg_linkV[0] = 0
endfunction
function SH2VH takes handle s returns handle
    local integer i = udg_dataV[0]
    local integer shi = H2I(s)
    if udg_dataV[0] >= 8192 then
        return null
    endif
    loop
        exitwhen i <= 0
        if shi == udg_linkV then
            return i
        endif
        if udg_linkV == 0 then
            set udg_linkV[0] = i
        endif
        set i = i - 1
    endloop
    if udg_linkV[0] == 0 then
        set udg_dataV[0] = udg_dataV[0] + 1
        set i = udg_dataV[0]
    else
        set i = udg_linkV[0]
    endif
    set udg_linkV = shi
    set udg_dataV = 0
    return i
    return null
endfunction
function SetV takes string s, handle h returns nothing
    local integer i = H2I(SH2VH(S2H(s)))
    if i == 0 then
        return
    else
        set udg_dataV = H2I(h)
    endif
    return
endfunction
function GetV takes string s returns handle
    local integer i = H2I(SH2VH(S2H(s)))
    if i == 0 then
        return null
    endif
    return udg_dataV
    return null
endfunction
function FreeV takes string s returns nothing
    local integer i = H2I(SH2VH(S2H(s)))
    if i == 0 then
        return
    else
        set udg_linkV[0] = i
        set udg_linkV = 0
        set udg_dataV = 0
    endif
    return
endfunction
[/jass]
在WE中新建整数数组变量dataV和linkV,数量为1,初始化为0。
然后把代码拷进自定义脚本区就行了。
如果你直接编辑Jass的话,使用之前请调用InitV()函数。
里面的某些函数可能会有与你的函数有重复的,如H2I()等等,保留一个就行
用法
handle GetV(string s)
取得动态变量的值,s为动态变量的名字。
SetV(string s,handle h)
设置动态变量的值,注意需要转化为handle类型
FreeV(string s)
销毁一个动态变量。
注意:如果你的动态变量名是新的,则会创建新的动态变量。

已经通过测试,绝对没有问题
发表于 2007-1-28 05:51:15 | 显示全部楼层
虽然想法不错,但个人感觉,这系统实在米什么实用价值...

PS:某H不要在帖子中插入隐藏wma好不...很多人不喜欢强制听歌的...
    要插入歌曲至少也要留出控制的界面吧...
回复

使用道具 举报

 楼主| 发表于 2007-1-28 18:55:36 | 显示全部楼层
如果是版规的话,我会遵守的
实用价值的确不大。不过我perfer this to gamecache+return bug来模拟可以销毁的全局变量.
回复

使用道具 举报

发表于 2007-1-28 19:03:31 | 显示全部楼层
其实也不是不能插入歌曲拉...
只是如果不能控制,打开多个你发的帖子时由于不能暂停歌曲就会很混乱...
所以希望插入歌曲时不要把高度宽度设成0,很不爽的说...
回复

使用道具 举报

发表于 2007-1-29 02:10:21 | 显示全部楼层
是不是用一个整数数组来贮存所有变量的句柄值,不过那个下标取法H2I(SH2VH(S2H(s))是在看得比较晕。。。
回复

使用道具 举报

发表于 2007-1-29 02:46:28 | 显示全部楼层
好吧...
S2H把一个string转成一个handle...
SH2VH在link数组中查找该handle是否存在,如果存在则返回data数组中对应位置滴handle值...
H2I就不说料...

既然说了就再补充一点...
如果这个系统在实际中使用,效率素很低滴(虽然不一定能感觉到),SH2VH还能大幅优化...
回复

使用道具 举报

 楼主| 发表于 2007-1-29 02:59:48 | 显示全部楼层
就请斑竹帮忙优化一下吧
回复

使用道具 举报

发表于 2007-1-29 03:19:26 | 显示全部楼层
好吧...
随着变量名增多,在link数组中滴查询次数也会变多...
假如有100个以上变量名,在访问第100以上滴变量时就要遍历100次以上...
特别当大量访问那些变量时就会变得很慢...
随之而来的问题就素H2I函数。在JASS中函数调用的开销非常大,在访问第100个变量时就要调用100次H2I...
优化方案:使用hash函数计算下标,把H2I写到循环外

好吧...以上当偶在胡扯...
实际使用中不会有很多变量,对于现在滴计算机来说这点计算量基本可以忽略恩...
回复

使用道具 举报

 楼主| 发表于 2007-1-29 06:09:38 | 显示全部楼层
原来是这样啊,写的时候也没注意这些,恩。
关键是考虑到WE中没有handle变量,所以才使用integer的。
使用hash定位是mpq中使用的方法,用在jass实际也不科学拉~
因为还不太清楚
integer array ia
set ia[8192] = 0
会占用多少字节?

已经按白银的提示优化鸟
回复

使用道具 举报

 楼主| 发表于 2007-1-29 06:55:00 | 显示全部楼层
貌似用jass实现hash比较困难
回复

使用道具 举报

发表于 2007-1-29 14:17:16 | 显示全部楼层
其实老早就有这个东西老....
回复

使用道具 举报

 楼主| 发表于 2007-1-29 23:08:37 | 显示全部楼层
没人放出来,我就自己写一个发出来。恩,就是这样
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 19:05 , Processed in 0.031716 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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