gocold 发表于 2010-1-27 12:29:57

#VARFUNC和 #FUNCTION有什么区别

gocold 发表于 2010-1-27 13:29:43

cmud的帮助,看例子中#newvar的变量不影响#var定义的变量。使用中有什么区别,什么情况下用那个
Syntax: #NEWVAR varname value defaultval

Creates a new variable in the current class. Does not search outside the class for any existing variable of the same name. Normally the #VAR command will search for existing variables and modify their value rather than creating a new variable. You can force #VAR to create a variable in the current class by using the syntax:

#VAR ./varname value

#NEWVAR is a shortcut for this syntax, but is a bit more efficient.

NEWVAR examples

#CLASS 0
#VAR A 1
#CLASS NewClass
#NEWVAR A 123
    creates a new variable @A within the current class (NewClass in this example) with a value of 123. Does not modify the existing @A variable like the #VAR command would.

seagate 发表于 2010-1-27 23:56:00

怎么说呢,这两者之间还是有区别的,区别其实就相当于C语言里面简单的函数定义你可以用简易的写法一句话就写出来,但是复杂的你就要老老实实的定义参数入口,定义返回,里面定义内部变量,等等。。。这就是区别。功能实现上的区别。而且我感觉varfunc实际上是兼容zmud的function而设置的,#function是新的函数形式,由于cmud有了内部变量,有了更直观的参数定义,有了明教的返回值输出方法,所以使用#function而不是变量定义的形式更 能满足你的要求。#varfunc很难实现非常复杂的语法。

reallove 发表于 2010-1-28 08:21:25

newvar 和var的区别是创建变量的地方,一个是在当前目录下,另一个默认是在根目录,创建的2种变量都是全局变量。好处是按目录创建的比较直观,导出方便

gocold 发表于 2010-1-28 11:43:37

回复 14# 的帖子

#CLASS 0
#VAR A 1
#CLASS NewClass
#NEWVAR A 123
    creates a new variable @A within the current class (NewClass in this example) with a value of 123. Does not modify the existing @A variable like the #VAR command would.

有区别吧,仔细看看例子

reallove 发表于 2010-1-28 14:10:48

回楼上,例子和我的解释并不冲突
例子中调用#newvar的时候,当前目录已经被切换到了NewClass了。
这时系统里存在2个变量
一个是/@a,另一个是/NewClass/@a
让我头疼的是Cmud在引用值的时候,我没办法区别这2个同名a的变量,这时在别处用@a取值,不确定取到的是哪个

简单的说/NewClass下的脚本中(包括触发、别名等等),使用#newvar命令,操作的都是/NewClass中的全局变量
你可以自己写脚本试试

seagate 发表于 2010-1-28 14:45:50

全局变量这块cmud特别混乱,你如果弄同名全局变量很容易出错。
我不认为用#newvar创建全局变量和#var就有什么区别,区别也仅仅
是创建时候的位置区别,真的用的时候估计还是一样糟糕。

zgbl 发表于 2010-3-1 14:18:06

发现bug

但是这里衍生出另外一个热门话题就是死锁问题。举例来说:
    #trigger {A} {#section {#va var1 1;#if @var2>1 {commands}}
    #trigger {B} {#section {#va var2 1;#if @var1>1 {commands}}
当这两个触发同时运行的时候就会产生问题,由于触发A对var1变量加锁,
但是要等待触发B对var2解锁才能执行下一步,而触发B对var2变量加锁,
但是要等待触发B对var1解锁才能执行下一步,两个语句互相等待资源,
就导致程序陷入死循环,当然也就完蛋了!

seagate 发表于 2010-3-1 15:50:01

已经更新!欢迎指正!
页: 1 [2]
查看完整版本: Cmud的全局变量、多线程和Event