关于PowerBuilder开发过程中的变量声明的一个坑

关于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里,我们声明变量,应该把变量放到最前面,而且,声明时不要对它赋值,而是声明后,再写一条赋值语句。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值