祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 7957|回复: 4

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

[复制链接]

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

[复制链接]
dazizai

主题

0

回帖

652

积分

版主

积分
652
贡献
在线时间
小时
2020-12-5 09:42:22 | 显示全部楼层 |阅读模式

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

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

×
关于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 赞一个!

查看全部评分

共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
ehxz

主题

0

回帖

57万

积分

管理员

积分
570604
贡献
在线时间
小时
2020-12-5 10:16:01 | 显示全部楼层
学习学习!!!好好学习,天天进步
共享共进共赢Sharing And Win-win Results
lifei1210

主题

0

回帖

478

积分

中级会员

积分
478
贡献
在线时间
小时
2022-1-15 21:07:51 | 显示全部楼层
学习了,不错
共享共进共赢Sharing And Win-win Results
pqiq

主题

0

回帖

698

积分

高级会员

积分
698
贡献
在线时间
小时
2022-7-28 00:49:07 | 显示全部楼层
这个坑不小!
共享共进共赢Sharing And Win-win Results
jie__001

主题

0

回帖

402

积分

中级会员

积分
402
贡献
在线时间
小时
2022-8-10 11:48:05 | 显示全部楼层
我之前在窗口声明实例变量 获取当前目录 is_dir = GetCurrentDirectory ( ) ,后续引用这个变量   is_dir就出问题了,原来是这个原因,真的被坑了.
共享共进共赢Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

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

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-4-24 08:37 , Processed in 0.287722 second(s), 11 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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