不是高手也来看看,这可是 Delphi 的 ==== 简单的致命伤害!!! (10分)

D

ddev

Unregistered / Unconfirmed
GUEST, unregistred user!
如下代码(简单的代码, Delphi 5E pacth-1):
type
PMyItem = ^TMyItem;
TMyItem = record
AText: string;
end;
TMyItemStream = type PMyItem;

有兴趣的不妨编译一下,你将发现什么?
===> [Fatal Error] Unit1.pas(xxx): Internal error: URW533
看看帮助,这是什么信息:
You should never get this error message - it means there
is a programming error in the compiler.

If you do, please call Inprise Developer Support and let
us know the ErrorCode (e.g. "C1196") that appears in the
error message. This will give us a rough indication what
went wrong. It is even more helpful if you can give us an
example program that produces this message.

如果有人可以和 Borland 联系,不妨一试。
 
的确如此,我用 Delphi5 的编译器编译出错;
但是用 Delphi7 的编译器就通过。
 
type
PMyItem = ^TMyItem;
TMyItem = record
AText: string;
end;
TMyItemStream = type PMyItem;

去掉 TMyItemStream = type PMyItem;
可用 TMyItemStream = PMyItem;

var
Form1: TForm1;
a: TMyItemStream;

在d6里没有问题。
 
to wjs:
你知道 TMyItemStream = type PMyItem;
跟 TMyItemStream = PMyItem
是有差别的吗?
一个是类型重定义,一个差不多相当于别名。
 
to ddev:
"一个是类型重定义,一个差不多相当于别名",就此例而言, 两者在使用上有区别吗?
 
各位大哥,我说的也许不对,但,是不是你用Type错了呢?
type
pMyItem = ^TMyItem;
TMyItem = record
AText : string;
end;
type//注意这里,因为你在上面已经End了,D给的提示是不对,但这也很正常呀!
TMyItemStream = type PMyItem;
就没有问题了!
 
to QQ989753:
yes, you're right !!!! compile passed!

你怎么知道这点的,首先,你肯定是对的,
其次,你能告诉我为什么吗?
 
另外,你要说是 end 的问题,也不尽然:
下面代码就能够通过:

type
TMyItem = record
AText: string;
end;
TMyItemStream = type TMyItem;
 
这肯定是编译器错误,虽然可以用 QQ989753 的方法避免,
但正如 hq_pan 所说的,如果 D7 能通过,说明这个错误
已经更正而已。

这个问题给大家一个启示:有时候,错误并不是自己的!
相信自己,但也要想办法避免(象 QQ989753,那样,一个
似乎无所谓的冗余,却正好解决了这个问题)。VCL 如此
辉煌,也有简单的 pascal 编译错误(这可是 Borland 的
起家工具啊),难以致信...
 
不要走,听我给你解释一下!
 
可能我已经找到答案了,当然,也可能只是自圆其说罢了,正如你这个例子
type
pMyItem = ^TMyItem;
TMyItem = record
AText : string;
end;
Delphi允许这样来定义类型,即定义结构体前先定义一下指向这个结构体的指针,那么,
理所当然的,它也应该有一个合适的地方来结束这个指针的定义,那么,什么时候它才是定义好了呢?Delphi的编译器认为,当
你定义下一个类型时,前一个一定定义好了。而这个说法大家也不会否认吧,就是:
当你想使用一个类型时,必须这个类型是已经定义好了的。这样,就可以解释上面的问题了。
这个例子最能说明问题了。
type
i = ^integer ;
type//这个Type用来说明上一个类型,即I已经定义好了,下面可以使用了。而当没有这个
//type时,D的编译器认为,你在没有定义好I的时候,就想使用I,所以,“我偏不!”
TMyItemStream = type i;
至于D7可以编译通过,说明D7已经可以智能的知道什么时候定义类型结束了,或,当你想用时,
它就认为已经结束了,这个我就不太清楚了,乱猜的,没机会用D7,也不懂那么深。就这样吧,
可能有错,但我是这么认为的,就当抛砖了。完!你听完了吧,现在,可以走了!
:)
 

哦?试试TMyItemStream = type TMyItem;
 
多人接受答案了。
 
顶部