前事不忘,后事之师,不忘国耻!

SAP SYBASE论坛中文社区技术服务

 找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 294|回复: 1
收起左侧

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

[复制链接]
dazizai 发表于 2020-12-5 09:42:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?站点注册

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

评分

参与人数 1威望 +30 收起 理由
ehxz + 30 赞一个!

查看全部评分

你不共享给别人,谁会共享给你?
SYBASE论坛欢迎您能交换更多好的信息,资料,代码……
富强,民主,文明,和谐;自由,平等,公正,法治;爱国,敬业,诚信,友善!
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
ehxz 发表于 2020-12-5 10:16:01 | 显示全部楼层
学习学习!!!好好学习,天天进步
你不共享给别人,谁会共享给你?
SYBASE论坛欢迎您能交换更多好的信息,资料,代码……
富强,民主,文明,和谐;自由,平等,公正,法治;爱国,敬业,诚信,友善!
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

QQ|Archiver|手机版|SYBASE论坛中文社区 ( 鲁ICP备20019049号-5 )

GMT+8, 2021-1-17 14:20 , Processed in 0.018860 second(s), 9 queries , MemCached On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表