全球FlexSim系统仿真中文论坛

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

作者: zorsite    时间: 2018-5-17 10:07
标题: IF语句声明的变量仅在IF代码块内有效
本帖最后由 zorsite 于 2018-5-18 13:17 编辑 9 W8 z  Q6 H! j
" {4 u7 O  q! Z  _( A: H
[attach]4398[/attach]
$ g) E' X3 v6 C: _. X8 w- Q4 W1 M; u如图所示:
! q6 n0 K: L% J0 m! b$ \使用Text实体显示处理器加工时间时,想要同时获取临时实体的类型值。以下是Text Display代码:
) n4 \" A& R" _, s, i) @! Z
  1. /**显示处理器加工时间*/
    : C) b& X) ~# ?
  2. treenode current = ownerobject(c);
    & o  v+ D' B1 _! m, z
  3. treenode  textnode = param(1);; t: y3 J2 @2 D% r+ @: X3 ^: {+ A

  4. 2 Y9 z) T0 D9 D6 }
  5. string starttext = "Object Stat: ";# N; \0 U; }* A
  6. treenode involved = node("Processor",model());. I( S2 H/ t) L8 w1 x1 Q
  7. string statstr = "";; O1 B4 A! J* P1 |3 t, h, y

  8. - M. l+ H, x! W/ I( g" u! j6 J
  9. if (content(involved)>0) //如果处理器上有临时实体6 F- l( r) d8 g% ]7 Y; C* p0 R
  10. {
    , D2 V! u; o) |# G% @6 B
  11.         treenode item = first(involved);9 R0 |4 ^0 L  m$ _
  12.         if (getstatenum(involved) == STATE_PROCESSING || getitemstate(item) != FRSTATE_INQUEUE)3 c' F- e( C. s( X2 L% K$ c
  13.         {//如果处理器处于加工状态  N* N5 s: p: d$ E
  14.                 statstr = numtostring(getitemvar(item, ITEMVAR_PROCESSTIME), 0, 2);2 W5 s( z% U' X2 {" }, Y; m, v9 C
  15.                 pt("01-");pd(getitemtype(item));pr;//获取当前正在被加工的临时实体的类型,并输出到Output Console9 s9 x* Q- i4 G5 j4 A
  16.         }        
    - f1 ^( g$ D6 P. U5 X" V5 e
  17. }' P' p+ D9 g$ P$ t1 g/ j* G+ R
  18. pt("02-");pd(getitemtype(item));pr;//获取当前正在被加工的临时实体的类型,并输出到Output Console
    # k5 }7 N6 I9 T) I* [
  19. setnodestr(textnode, concat(starttext, statstr));
复制代码

3 f: `4 U' q! Q7 d) h5 n0 |$ Q; K- N' u+ [
理论上来讲,如果处理器上有item正在被加工,则不管是在if模块内部,还是外部获取item type,都应该是一样的结果。
0 S+ H" }. ]/ i4 P$ s2 w& m但Output Console观察到的结果却显示:只有在if模块内部才能正确获取到item type,写在if代码块外部的语句无效。1 b1 z1 f8 T8 s' N! S- K' f& D# B* B
[attach]4399[/attach]- G- t9 q3 V0 Z! m' \) R

- r- N, b% E9 E) i% h  _- f# B! I: |3 R$ Z" O( i

作者: zorsite    时间: 2018-5-17 10:16
本帖最后由 zorsite 于 2018-5-18 13:29 编辑
) B. I+ s4 |, u* O; c4 k, d$ Y# u9 l  T$ C; k
忽然有些觉悟。' b' V. H6 j$ t
将item的声明移出if模块,放在if语句前面,则两行获取item type的代码都有效。6 Y8 F1 ^; I1 i9 p
在if模块内部声明的变量仅在模块内生效,也不能传递至else代码块。
作者: 慧娴亚伦    时间: 2018-5-20 09:27
声明变量作用域的问题
0 z5 O' x; w* f6 m在代码执行过程中,某些变量值很可能发生变化,但是提前获取过的声明则不会发生改变。




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