全球FlexSim系统仿真中文论坛

标题: IF语句声明的变量仅在IF代码块内有效 [打印本页]

作者: zorsite    时间: 2018-5-17 10:07
标题: IF语句声明的变量仅在IF代码块内有效
本帖最后由 zorsite 于 2018-5-18 13:17 编辑 - N( n6 M$ }) \
$ B, Q) T- b4 B! H" c
[attach]4398[/attach]+ V1 l0 n; F0 }# g" {
如图所示:+ p6 ^/ ~. X/ d5 h( E+ @- a0 p# e
使用Text实体显示处理器加工时间时,想要同时获取临时实体的类型值。以下是Text Display代码:
# m0 l, r$ K5 r- M2 c6 n; ]; l
  1. /**显示处理器加工时间*/: p) h8 U7 Q" q! G! s
  2. treenode current = ownerobject(c);
    $ y/ [* R* }1 j4 H. w9 O- \
  3. treenode  textnode = param(1);
    8 r; g6 W3 R, O3 i: i
  4. 9 u. ]" E2 v% C7 f
  5. string starttext = "Object Stat: ";7 s. j! ~* h5 G$ p5 V4 Z( T5 x
  6. treenode involved = node("Processor",model());; |  C0 i9 V% D3 Y9 |& S
  7. string statstr = "";
    6 m8 M% O% ?* @; C8 o1 t

  8. 4 s' i% ?7 _6 Z5 ^0 x. _
  9. if (content(involved)>0) //如果处理器上有临时实体0 k6 `5 u" E- n; w+ W4 y
  10. {
    4 I1 x% o' Y( w/ N7 z' |7 n% H
  11.         treenode item = first(involved);$ k' `0 E' H3 [$ a( V
  12.         if (getstatenum(involved) == STATE_PROCESSING || getitemstate(item) != FRSTATE_INQUEUE)
    / H. ~% S$ C. p  v8 x, V! O
  13.         {//如果处理器处于加工状态
    & H8 B# A) z2 `- P; e
  14.                 statstr = numtostring(getitemvar(item, ITEMVAR_PROCESSTIME), 0, 2);
    1 x, `0 P  @" G% h
  15.                 pt("01-");pd(getitemtype(item));pr;//获取当前正在被加工的临时实体的类型,并输出到Output Console9 S& o- c/ b* v) Y( X$ A/ [
  16.         }        6 i4 `# v* E& S4 F2 X- Y
  17. }( w9 H& i4 r6 f7 j- a, B
  18. pt("02-");pd(getitemtype(item));pr;//获取当前正在被加工的临时实体的类型,并输出到Output Console
    ; x; w  @/ V& z9 F- b$ H3 Y
  19. setnodestr(textnode, concat(starttext, statstr));
复制代码
* e' o* i: _+ Q& `

( i1 ]' \6 ?+ ^: a2 n( H理论上来讲,如果处理器上有item正在被加工,则不管是在if模块内部,还是外部获取item type,都应该是一样的结果。/ Q- E- F8 z) {- V) ^* M& v. h' [
但Output Console观察到的结果却显示:只有在if模块内部才能正确获取到item type,写在if代码块外部的语句无效。
- r# X; y' t* R: D6 d[attach]4399[/attach]3 j- Y( j7 _! U* [/ f! T
0 c( d8 z/ p0 C3 Y

' o2 A( j% R4 j; K* K
作者: zorsite    时间: 2018-5-17 10:16
本帖最后由 zorsite 于 2018-5-18 13:29 编辑
' H  X0 j  u* s/ E8 o" q* r; c2 I% l" ^7 d) [/ x5 b
忽然有些觉悟。
$ W" A& [3 `) g2 ]3 x将item的声明移出if模块,放在if语句前面,则两行获取item type的代码都有效。
# e. l8 l9 @3 [- [1 @2 K在if模块内部声明的变量仅在模块内生效,也不能传递至else代码块。
作者: 慧娴亚伦    时间: 2018-5-20 09:27
声明变量作用域的问题
) e8 g. T  q6 {0 N0 u在代码执行过程中,某些变量值很可能发生变化,但是提前获取过的声明则不会发生改变。




欢迎光临 全球FlexSim系统仿真中文论坛 (http://www.flexsimasia.com/) Powered by Discuz! X3.3