为什么要子程序:
为了实现程序结构化,我们尽量使用不同功能的功能块来实现一些特定的功能,
子程序接口:
使用过程的注意事项,尤其是数组使用时的注意事项
从一个主程序中可以将参数传递到局部或全局子程序和函数中。
怎样传递参数有 2 种方式:
- 作为 IN 参数
变量值在主程序中保持不变。
这种传递方式也称为“ 值传递 (Call by Value)”。 - 作为 OUT 参数
子程序读取并更改该值,然后将新值写回到主程序中。
这种传递方式也称为“Call by Reference”。
举例说明
1 DEF MY_PROG( )
2 DECL REAL result, value
3 value = 2.0
4 result = CALC(value)
5 ...
...
END
说明
3 给“value” 赋值“2.0”。
4 调用函数 CALC,并传递“value” 的值。
给变量“result” 分配函数的返还值。
在将该值作为 IN 参数传递时发生了什么?
带 IN 的函数 CALC():
1 DEFFCT REAL CALC(num:IN)
2 DECL REAL return_value, num
3 num = num + 8.0
4 return_value = num * 100.0
5 RETURN(return_value)
6 ENDFCT
1 将“value” 的值作为 IN 参数传递给“num”。该值还为2.0。
3 更改“num” 的值。该值现在为 10.0。
4, 5 计算“return_value” 的值并将该值发回到主程序的变量“result” 中。该值为 1000.0。
6 函数已结束,从行 5 起继续执行主程序。
提示:主程序中“value” 的值未更改,为 2.0。
在将该值作为 OUT 参数传递时发生了什么?
带 OUT 的函数 CALC():
1 DEFFCT REAL CALC(num:OUT)
2 DECL REAL return_value, num
3 num = num + 8.0
4 return_value = num * 100.0
5 RETURN(return_value)
6 ENDFCT
1 将“value” 的值作为 OUT 参数传递给“num”。该值还为2.0。
3 更改“num” 的值。该值现在为 10.0。
4, 5 计算“return_value” 的值并将该值发回到主程序的变量“result” 中。该值为 1000.0。
6 函数已结束,从行 5 起继续执行主程序。
提示:主程序中“value” 的值现在为 10.0。
注意事项:
传递数组:
- 只允许作为 OUT 参数传递数组。
例外:也可以将 CHAR 数组作为 IN 参数传递。 - 只能将完整的数组传递到另一个数组中。
- 在子程序中始终在不带数组大小的情况下声明数组。数组大小与原数组适
配。
DEF Send_Data (Head:in,OrderType:in,Len:in,Station:in,PointIndex:in,reserved:in)
DECL CHAR Head[],Send_Char[272]
DECL INT i,OrderType,Len,Station,PointIndex,reserved
FOR i=1 TO 272
Send_Char[i]=0
Endfor
OFFSET=0
CAST_TO(Send_Char[],OFFSET,Head[],OrderType,Len,Station,PointIndex,reserved)
RET=EKI_Send("Carrys",Send_Char[])
wait sec 0
END
其中Head[ ] 被作为参数 in 或者 out 时可以不用声明数组范围,因为调用的内容输入时即可决定其数组长度,但是当没有被调用时必须定义其数组边界,比如定于为 Send_Char[272]
DECL CHAR Head[2],Send_Char[272]