DELPHI7与DELPHI5的不同之处,大家说说为什么会这样(100分)

  • 主题发起人 主题发起人 yangying_2000
  • 开始时间 开始时间
Y

yangying_2000

Unregistered / Unconfirmed
GUEST, unregistred user!
今天调个程序的时候发现,DELPHI7与以前版本的REGISTER函数调用约定居然顺序不一样了,变成了从由到左,害我查了好久的错。我不想改以前的程序了,谁知道怎么指定缺省的函数调用约定不?就是说我想只改一个地方,免得所有函数的声明都要加PASCAL调用约定。谁先告诉我分都给他。
另外我觉得这样变了后真的很不好,大家说呢
 
我刚测试了,D7 中 Register 还是从左到右压栈。
你是不是其它地方弄错了。我想这种事 Borland 也不敢想改就改。
 
我覺得可能是你其它地方弄错了
 
to savetime:
下面是我自己的DELPHI7上的测试代码,请试试,看结果如何,也许我的D7装的有问题,或者没打补丁之类,我想查清楚一下

var
Num: Integer = 0;

//如果给这个函数加上pascal的指示字,结果为1,2否则都为2,1
procedure Test(p1, p2: Integer)

begin
ShowMessage(IntToStr(p1));
ShowMessage(IntToStr(p2));
end;

function GetNum: Integer;
begin
Inc(Num);
Result := Num;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Test(GetNum, GetNum);
end;

 
还没安D7,嘿嘿
 
我的测试结果和你的一样。

1、这样不会有问题。
procedure TForm1.Button1Click(Sender: TObject);
var
a1, a2: Integer;
begin
a1 := GetNum;
a2 := GetNum;
Test(a1, a2);
end;

2、把 GetNum 复制一份 GetNum2 再调用:
procedure TForm1.Button1Click(Sender: TObject);
begin
Test(GetNum, GetNum2);
end;
还是有问题。

确实有问题,让我想一想。
 
看明白了,Register 中 Delphi 先计算参数中右边的函数 -> push eax,再计算左边的函数 -> pop edx,这样可以优化代码。
Pascal 中先计算左边的函数,push eax,再计算右边的函数,push eax。

所以还是尽量不要将这种特殊函数作为参数。
 
我------D6
 
有谁知道怎么调整这个参数吗?
就是让REGISTER调用的顺序变成由左到右,以前版本的DELPHI的REGISTER都是从左到右的
还有谁用D6的测试下,看结果如何
 
Object Pascal 中好像没有规定参数中表达式的计算顺序,所以 Delphi 可以为了某些优化情况改变函数调用顺序。
当然,我也知道你现在是希望解决这个问题,只是我还没有好的办法。 :(
 
KAO,怎么会这样?我用D6,幸好不是D7
 
我是D6,D6下结果:如果给这个函数加上pascal的指示字,结果为1,2否则都为2,1。
正关注中
 
我刚看了一下帮助,帮助上这样说的,

The register and pascal conventions pass parameters from left to right
that is, the left most parameter is evaluated and passed first and the rightmost parameter is evaluated and passed last.

不过我试了一下,在很多情况下的确是先计算右边的参数,
我们还是不要依赖它在函数中的计算次序为好
 
自找麻烦。。。
 
我觉得不应该这样写,程序语句的意思必须清楚明确,这是PASCAL一直坚持的,
这样特殊的调用,最少应该加一个临时变量,而不应该让编译器猜想你的意思
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Test(GetNum, GetNum2);
end;
这个问题好像大家都遇到了,小弟试过了,最后只有放弃,多加几行代码解决。
编译器无法接受啊。
 
后退
顶部