Delphi 7惊天大bug。跨单元函数默认参数缓存不同步!!!!! ( 积分: 100 )

  • 主题发起人 主题发起人 我心蓝蓝
  • 开始时间 开始时间

我心蓝蓝

Unregistered / Unconfirmed
GUEST, unregistred user!
在编程中发现。
一个单元调用另一个单元的函数,若这个函数有默认参数。那么,你改动这个默认参数值时,这个值不会更新,还是以前的值。
funtion test(a: integer=1)

第一次这个你调用test;运行结果 ,为1。你改成
funtion test(a: integer=2)
再运行,这个结果还是1;

注: 研究发现,你编译 或者直接运行,并且是跨单元(调用和函数都在同一个单元没问题),都有这个问题。你用build则正常。
刚跟同事验证一下,的确有问题,各位兄弟,研究下,是delphi bug否?
 
关注 还真的有这个问题
不过楼主在调用单元随便某处 加个字符再删去就好了
貌似是个bug 或许某个编译开关的问题
 
已测试,没发现这个BUG,是不是有特定的环境?
 
源码
第一个单元:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
test;
end;

end.
第二个单元,一个单元,没有窗体
unit Unit2;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

function test(a: integer = 2): string;

implementation

function test(a: integer): string;
begin
showmessage(inttostr(a));
end;

end.



第一边运行,showmessage为2,之后你把 function test(a: integer = 2): string;
改为function test(a: integer = 1): string; 点运行 显示还是1。(注意,是运行。不要Build)
 
是有这个问题的,我也试了。
但是如果每次修改之后用build的话没有这个问题。如果直接compile或者run则有这个问题。

ps: build到底与run和comile有具体的啥区别?
 
楼主把在改完function test(a: integer = 1):
把test全 test1 直接点运行试试
 
Avalon 改个函数名 那是OK。其实,改个函数名,应该就跟Build差不多了。 看样子,是compile与build不同。compile时编译改动过的东西,看样子,delphi在判断改动默认值时有问题了
 
这不是bug,
run和compile只编译有改动的单元。
build则全部单元重新编译连接。
 
Delphi2006 没发现此问题。
 
这不是bug,
run和compile只编译有改动的单元。
build则全部单元重新编译连接
----------------------------------
难道我改了里面的参数就不算改?
 
由于默认值是个立即数,在使用此函数的单元对立即数是直接编译到代码内的
类似 mov eax 1 这么一句
所以你修改函数原形后,原先已经编译的使用此函数的单元还是没更新,仍然是 mov eax 1。
 
2000年就知道了,算不上什么Bug。不过有的时候却是比较不爽。只要Build就可以了
 
类里面的方法不会,单独函数可能是Delphi编译时的问题。
 
类里面的方法不会,单独函数可能是Delphi编译时的问题。
----------------------------------------------------
兄弟不要误导人,我发现问题就是在类里面发现的,后来在外部函数试验的
 
将dcu文件删除就没有这个问题了啊。还有,设置编译环境也可以将这个问题去掉。
原因在于:如果源代码没有变化,编译器将直接使用dcu文件,否则,重新编译dcu文件用于编译可执行代码。
 
有一点搞不明白,难道改变了函数的参数不叫改变了源代码么?
 
呵呵
这个问宝兰去。
可能当初就没有将这个因素考虑进去。否则修改一个注释也重新编译DCU的话。编译一个大项目岂不费时?
 
注意一点,delphi是先把单元文件(*.pas)编译为dcu文件,然后再连接dcu文件为exe文件。
当某个pas文件没改动的时候,默认情况下run和compile操作时不会重新生成此单元的dcu文件,因此最终exe文件内看不到相应改动。这也是提高编译速度的一个方法。
另外,在单元文件内添加或者修改注释,也会导致重新编译此单元,delphi还没有智能到能够分辩你是改动了注释还是改动了代码的程度。
 
呀,偶好崇拜你啊!

发现这么大一个石破惊天的 BUG 啊,真得非常神经病啊。

偶服了。

偶怎么就不觉得它是 BUG 啊,偶太无能了,简直比性无能还无能啊,太无能了!

偶一定要把这个帖子贴到爆烂去,爆烂都烂到这种程度了,还要搞得年轻一代变成蠢材、

性无能唤起者、猪头疯重症患者,简直太无雄了。

祖国万岁!打倒爆烂!誓死不用垃圾货色!
 

Similar threads

回复
0
查看
992
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
913
SUNSTONE的Delphi笔记
S
后退
顶部