马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?站点注册
×
关于PowerBuilder开发过程中的变量声明的一个坑
PowerBuilder的变量声明随意性比较大,因而就有人一不小心为此挖坑,导致有出现问题而莫名其妙。本文就简单分析一下原因。
先举一小段例子:
Int i
For i = 1 to 3
Int n = i
MessageBox("",n)
Next
这段代码很典型。大家可以很思考一下,MessageBox会显示3次,分别显示的是什么内容呢?也许你所预料的应该是显示1、2、3,然而事实与你预想大相径庭,实际上3次都会显示0。
为什么会这样?
为测试,你可以编译时,把你的程序PBD改成编译DLL。当你开始编译的时候,PB会在windows的临时目录里生成一堆 .c 文件,我们可以快速地把这些个文件复制一部分出来,否则它编译完了会自动删除的。下面是我复制出来的.c源码里的某一段的局部内容。
/*
*------------------------------------------------------------
* Beginning of class 'gf_colortostring'
*------------------------------------------------------------
*/
/* FUNCTION gf_colortostring */
PBWINAPI( INT, _fn_21_32769_19 )
(
POB_THIS _obThis,
UINT _numArgs
)
{
/* start of local variables */
/* local 'str' maps to _obdataArray[0]*/
/* local 'n' maps to _obdataArray[1]*/
/* local 'dw' maps to _obdataArray[2]*/
/* start of local temperaries */
.......
对应的PB函数代码是:
global type gf_colortostring from function_object
end type
forward prototypes
global function string gf_colortostring (long al_clr, integer ai_type)
end prototypes
global function string gf_colortostring (long al_clr, integer ai_type);string str
int n
str= space(100)
uo_datawindow dw
str = dw.ColorToString(al_clr,ai_type)
return str
end function
对照上面的PB源码和编译器翻译后的 .c 源码,请注意这里:
/* start of local variables */
/* local 'str' maps to _obdataArray[0]*/
/* local 'n' maps to _obdataArray[1]*/
/* local 'dw' maps to _obdataArray[2]*/
看明白了没有?编译程序使用的变量名,与我们声明的变量名不是一回事,它会自动搜索源码中使用到的变量,而且不管代码里变量在哪个位置声明,它都把所有变量都转换放到一个数组_obdataArray[]中去,而这个数组是放到最先声明(这符合c语言的语法要求)。
回到前面的例子里,Int n = i这一句,被编译器认为是一条声明语句,所以,它被最早添加到_obdataArray[]中去,并且被初始化为0,并且这行代码被从循环体中抽离,所以我们运行上面那段代码的时候,实际上并没有发生赋值动作,只是显示最初的初始值。
由此我们得出结论,在PB里,我们声明变量,应该把变量放到最前面,而且,声明时不要对它赋值,而是声明后,再写一条赋值语句。
|