dazizai 发表于 2020-12-5 09:42:22

关于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*/
      /* local 'n' maps to _obdataArray*/
      /* local 'dw' maps to _obdataArray*/
/* 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*/
      /* local 'n' maps to _obdataArray*/
      /* local 'dw' maps to _obdataArray*/
看明白了没有?编译程序使用的变量名,与我们声明的变量名不是一回事,它会自动搜索源码中使用到的变量,而且不管代码里变量在哪个位置声明,它都把所有变量都转换放到一个数组_obdataArray[]中去,而这个数组是放到最先声明(这符合c语言的语法要求)。
回到前面的例子里,Int n = i这一句,被编译器认为是一条声明语句,所以,它被最早添加到_obdataArray[]中去,并且被初始化为0,并且这行代码被从循环体中抽离,所以我们运行上面那段代码的时候,实际上并没有发生赋值动作,只是显示最初的初始值。
由此我们得出结论,在PB里,我们声明变量,应该把变量放到最前面,而且,声明时不要对它赋值,而是声明后,再写一条赋值语句。

ehxz 发表于 2020-12-5 10:16:01

学习学习!!!好好学习,天天进步

lifei1210 发表于 2022-1-15 21:07:51

学习了,不错

pqiq 发表于 2022-7-28 00:49:07

这个坑不小!

jie__001 发表于 2022-8-10 11:48:05

我之前在窗口声明实例变量 获取当前目录 is_dir = GetCurrentDirectory ( ) ,后续引用这个变量   is_dir就出问题了,原来是这个原因,真的被坑了.
页: [1]
查看完整版本: 关于PowerBuilder开发过程中的变量声明的一个坑

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com