全球FlexSim系统仿真中文论坛

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

作者: zorsite    时间: 2018-5-17 10:07
标题: IF语句声明的变量仅在IF代码块内有效
本帖最后由 zorsite 于 2018-5-18 13:17 编辑 , A  V! O% w9 U
0 O" q' j3 I# W8 P+ X8 {" _+ {$ _8 l
[attach]4398[/attach]; |1 B( c# T8 z( Y3 H; Q
如图所示:7 `. [. |; ?9 p. @
使用Text实体显示处理器加工时间时,想要同时获取临时实体的类型值。以下是Text Display代码:0 B$ l" q* o  n! f$ J0 X' H. t
  1. /**显示处理器加工时间*/  c/ K- F# W$ u' J1 H1 G
  2. treenode current = ownerobject(c);  q8 k* Z0 h9 |$ Z. O
  3. treenode  textnode = param(1);
    4 z& X" `# t- t4 u; \. `, k

  4. ! b6 k. @- L0 ?' I3 M% E
  5. string starttext = "Object Stat: ";
      u) S, @  R2 P0 M3 s
  6. treenode involved = node("Processor",model());
    - \' U5 k- H8 R; n  b
  7. string statstr = "";7 U/ s+ }5 u, x# J3 B9 k, J
  8. - f" x+ ]$ w3 A- D/ }  u1 [$ D
  9. if (content(involved)>0) //如果处理器上有临时实体
    . [' R$ Q, K$ J* p: ]6 i( t. r5 A
  10. {, a. ?" b! \! `+ {" e
  11.         treenode item = first(involved);
    # h! g, @/ g: ~$ L( F
  12.         if (getstatenum(involved) == STATE_PROCESSING || getitemstate(item) != FRSTATE_INQUEUE)
    ; C# ~- P  @4 v6 i0 Z
  13.         {//如果处理器处于加工状态* ^, T' Y) O9 n3 e
  14.                 statstr = numtostring(getitemvar(item, ITEMVAR_PROCESSTIME), 0, 2);
    + L) }1 a" k8 ^6 g
  15.                 pt("01-");pd(getitemtype(item));pr;//获取当前正在被加工的临时实体的类型,并输出到Output Console
    5 V# p, q7 X1 q+ k
  16.         }        ; _& D8 K3 t2 K# g
  17. }
    3 V  g" U# w. n
  18. pt("02-");pd(getitemtype(item));pr;//获取当前正在被加工的临时实体的类型,并输出到Output Console
    3 ]3 F( b. v7 n+ \+ I
  19. setnodestr(textnode, concat(starttext, statstr));
复制代码
& y7 K: x9 |/ f8 P' M2 U

7 u$ D- G$ y6 U* D6 k. S理论上来讲,如果处理器上有item正在被加工,则不管是在if模块内部,还是外部获取item type,都应该是一样的结果。) c6 y  `9 A$ J0 Y. C  R
但Output Console观察到的结果却显示:只有在if模块内部才能正确获取到item type,写在if代码块外部的语句无效。
% Y  i$ v9 E5 `  v[attach]4399[/attach]% p; c9 y- _/ n' J/ k$ Q. j
  n7 F+ f& p4 E: ^
, h0 A; L$ P4 \% o

作者: zorsite    时间: 2018-5-17 10:16
本帖最后由 zorsite 于 2018-5-18 13:29 编辑 # ]9 w7 y1 e5 X5 j

7 E6 U% E; w1 z* m  s: d忽然有些觉悟。
# {. G# A; l1 l9 P+ C1 t将item的声明移出if模块,放在if语句前面,则两行获取item type的代码都有效。
1 Y5 G- D% q( V0 j+ h8 G3 @& ^在if模块内部声明的变量仅在模块内生效,也不能传递至else代码块。
作者: 慧娴亚伦    时间: 2018-5-20 09:27
声明变量作用域的问题
* I, Y+ }) N' z在代码执行过程中,某些变量值很可能发生变化,但是提前获取过的声明则不会发生改变。




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