数学建模社区-数学中国

标题: 模块变量及编译符mvar的使用 [打印本页]

作者: forcal    时间: 2011-5-27 19:11
标题: 模块变量及编译符mvar的使用
Forcal中,通常模块变量要先声明,后使用。例如:
  1. init(::a,b,c)= a=11, b=22, c=33;  //模块变量赋初值6 {9 T1 s6 u9 E" l* g/ n
  2. f(x::a,b,c)=x+a+b+c;  //函数f中使用了模块变量
    $ U' J- q2 D! b/ @  n
  3. f(1);  //函数调用
复制代码
结果:
( ~) R0 F2 E' R: d1 y, M* \67.& \, q& O, U) {
0 }$ [, k4 X0 k3 t( e
当使用编译符mvar时,未声明的变量均看作模块变量,故前面的例子可写成:
  1. mvar:
    $ x7 |  T, {6 A" }! c* i
  2. a=11, b=22, c=33;  //模块变量赋初值
    9 ~$ G3 ^* m( l1 V
  3. f(x)=x+a+b+c;  //函数f中使用了模块变量$ `" _& q; m, P9 G9 t6 b) \
  4. f(1);  //函数调用
复制代码
结果:
1 h4 x  u5 Y: g& M67.$ E; C, l% s' Z, ?
; X& v2 Q* e- |" R
这样看起来似乎不错,的确,在简单的程序中,这样写代码很简洁方便。不过,在复杂的程序中却不推荐使用编译符mvar,因为它常常会隐藏一些人为的错误,例如下面的代码通过了编译,但--看看你的眼力,能否发现其中的错误?
  1. mvar:$ B) b, ?/ n4 u: W9 v9 g
  2. a=11, b=22, c=33;  //模块变量赋初值
    : X8 E9 j8 G) B* y2 `, t9 u
  3. f(x)=x+a+d+c;  //函数f中使用了模块变量& u6 ~! G* ]# |! Y+ N  J" z3 ^3 |
  4. f(1);  //函数调用
复制代码
若显示地声明模块变量,编译器会帮你发现这个错误:
  1. init(::a,b,c)= a=11, b=22, c=33;  //模块变量赋初值; i5 Z" U& l/ Y7 b3 c
  2. f(x::a,b,c)=x+a+d+c;  //函数f中使用了模块变量
    & N- x: t8 X! W7 g3 i$ U! n
  3. f(1);  //函数调用
复制代码
故复杂的程序中,慎用编译符mvar。
作者: pxwgih    时间: 2012-1-1 13:45
我反复看了多遍,好帖,得支持
作者: alair004    时间: 2012-2-6 14:33
囧了,下了无数不知道用哪个有用1988890824492765




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5