Virtools脚本语言(VSL)教程 - 函数

<h3>声明VSL</h3>
<h4>
<a name="TOC-1"></a>
函数定义语法</h4>
<p>函数定义确立了函数的名称、它的返回值类型、它的形参的类型和数量、及函数主题。</p>
<p><em>returnType functionName</em>
( [<em>paramList</em>
] ) { <em>functionBody</em>
}</p>
<p>paramList :<br><em>parameter</em>
, ...</p>
<p>parameter :<br><em>type parameterName</em>
</p>
<p>实例:</p>
<pre>int Square(int i)<br>
{<br>
return i*i;<br>
}<br><h4>
<a name="TOC-2"></a>
函数参数</h4>
<p>参数是函数期望接收到的值。在函数原型中,函数名后面跟着的括号里包含了函数参数与其类型的完整列表。参数声明指定了参数中存储的值的类型、大小及标识符。</p>
<p>在声明参数时,你可以指定缺省值。</p>
<pre>void MakeAction(int actionNumber, bool logInConsole = false)<br>
{<br><span>// Make action according to actionNumber</span>
<br><span>// ...</span>
<br><br>
if (logInConsole)<br>
{<br>
String message("Make Action Num ");<br>
message += actionNumber;<br>
bc.OutputToConsole(message);<br>
}<br>
}<br><br>
void main()<br>
{<br>
MakeAction(0, true);<br>
MakeAction(1, false);<br><br><span>// In this case, second parameter of MakeAction</span>
<br><span>// is equal to default value false</span>
<br>
MakeAction(0); <br>
}<br><p>你也可以声明不带参数的函数。</p>
<pre>float Pi()<br>
{<br>
return 3.14156;<br>
}<br><h4>
<a name="TOC-3"></a>
函数返回值</h4>
<p>函数的返回值类型确立了函数返回值的大小和类型。<br>
这里是一份所有类型说明符的清单:</p>
</pre></pre></pre>
<ul>
void<br>
char<br>
int<br>
float<br>
VSL enum<br>
VSL struct<br>
C/C++ struct/class
</ul>
<p>
你可以声明不带返回值类型的函数。这种情况下,你得用"void"作类型名。</p>
<pre>void Print(String s, int line)<br>
{<br>
s += line;<br>
bc.OutputToConsole(s);<br>
}<br><h4>
<a name="TOC-4"></a>
函数重载</h4>
<p>VSL允许声明多个同名函数。这些函数叫做被重载的函数。重载函数让程序员能根据参数的类型和数量对某个函数补充不同的语义。</p>
<p>实例:</p>
<pre>int Add(int a, int b) <span>// Add two int</span>
<br>
{<br>
return a + b;<br>
}<br><br>
float Add(float a, float b) <span>// Add two float</span>
<br>
{<br>
return a + b;<br>
}<br><pre>void main()<br>
{<br>
float r1 = add(10.0,5.0); <span>// Call first Add function</span>
<br>
int r2 = add(1,2); <span>// Call second Add function</span>
<br>
}<br><p>在你重载函数时,由VSL编译器选择所匹配的函数。某些情况下,你会处在一种模棱两可的境地,因为编译器不知道选哪个函数。</p>
<pre>void main()<br>
{<br>
float r = add(10.0, 5); <span>// error, ambiguous call</span>
<br>
}<br><p>这个函数的调用就是模棱两可的,因为所有函数都可用:<br>
10.0 可以被计算成整数或5可以被计算成浮点数。</p>
<h3>
<a name="TOC-5"></a>
调用函数</h3>
<p>在一个VSL脚本中,你可以调用当前脚本中定义的任何VSL函数、全局脚本中的函数或任何限定的C/C++函数。定义函数并不是执行它。定义函数是对该函数简单命名及指定当函数被调用时做什么。对函数进行调用实际上就是执行那些指定的行为。</p>
<h4>
<a name="TOC-6"></a>
递归</h4>
<p>函数甚至可以被递归。即它可以调用它自己。例如,这里有一个计算Fibonacci数的函数:</p>
<pre>int fibo(int n)<br>
{<br>
if (n == 0)<br>
return 0;<br>
if (n == 1)<br>
return 1;<br>
return fibo(n-2)+fibo(n-1);<br>
}<br><br>
void main()<br>
{<br>
fibo(3); <span>// return 2</span>
<br>
fibo(4); <span>// return 3</span>
<br>
fibo(5); <span>// return 5</span>
<br>
fibo(6); <span>// return 8</span>
<br>
}<br><h4>
<a name="TOC-VSL-"></a>
给VSL函数传递参数</h4>
<p>VSL中所有基本类型(bool, char, int, float, str)<span> </span>
通过值来传递。值传递给函数,但如果该函数改变了该参数的值,此改变不会对全局或调用函数中产生影响。</p>
<pre>void foo(int a)<br>
{<br>
a = 10;<br>
bc.OutputToConsole(a); <span>// Print 10 in the console</span>
<br>
}<br><br>
void main()<br>
{<br>
int b = 3;<br>
foo(b);<br>
bc.OutputToConsole(b); <span>// Print 3 in the console</span>
<br>
}<br><p>VSL结构与C/C++结构/类由引用来传递。如果函数修改了所引用的参数,它也修改了那个原始的。</p>
<pre>void ChangeVector(Vector v)<br>
{<br>
v.x = 1.0;<br>
v.y = 2.0;<br>
v.z = 3.0;<br>
}<br><br>
void main()<br>
{<br>
Vector v(0.0,0.0,0.0); <span>// the members x, y and z are equal to 0.0</span>
<br><br>
ChangeVector(v);<br>
bc.OutputToConsole(v.x); <span>// Print 1.0</span>
<br>
bc.OutputToConsole(v.y); <span>// Print 2.0</span>
<br>
bc.OutputToConsole(v.z); <span>// Print 3.0</span>
<br>
}<br><h4>
<a name="TOC-C-C-"></a>
给C/C++函数传递参数</h4>
<p>在调用C/C++函数时,遵守C/C++中函数声明规则。VSL中不支持常量参数,但可以使用C/C++常数函数及使用带常量参数的C/C++函数。既然const关键字为被实现,你必须在使用带常量参数的C/C++函数时谨慎一些。</p>
</pre></pre></pre></pre></pre></pre></pre>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值