遭遇错误:[Fatal Error] Internal error: L470。 --是不是delphi编译器的BUG? (0分)

D

dirk

Unregistered / Unconfirmed
GUEST, unregistred user!
这两天真衰,昨天的一个帖子被某个版主删了,只是想发表一下心情,不知道为什么!
今天编程,在一个TDataModule里添加了二个字符串常量数组,还压根儿没在程序中使用,
运行测试一下,另一个早就做好的、n久没有碰过的(n>30天)、没有错误的、毫不相干的
模块居然出错,错误涉及的代码主要是:
function TFrm_set.GetUnit: boolean;
var
i:integer;
begin
Result :=false;
with DM_Power do
begin
SQL:='select TBJH003_001 as [id],TBJH003_002 as [name] from TBJH003';
ADOQ_1.Close;
ADOQ_1.SQL.Clear ;
ADOQ_1.SQL.Add(SQL);
ADOQ_1.Open ;
while not ADOQ_1.Eof do
begin
if FReg.ValueExists(RvUnitx+trim(ADOQ_1.FieldByName('id').AsString)) then
begin
i:=length(SysDW);
setlength(SysDW,i+1);
SysDW.ID :=ADOQ_1.FieldByName('id').AsInteger ;
SysDW.SelectedID :=FReg.ReadInteger(RvUnitx+trim(ADOQ_1.FieldByName('id').AsString)) ;
SysDW.Name :=trim(ADOQ_1.FieldByName('name').AsString) ;//<<--出错行
……
其中SysDW是个动态数组,也在那个TDataModule中定义的,数据库中有值的,setlength,
再赋值,居然出错,错误是写非法地址?????
想来想去,之前只是在那个TDataModule中加了两个常量数组,把那两行注释调,哈哈,好
嘛,Ctrl+F9,就出现了错误:Internal error: L470 ,我晕、我晕、我晕晕晕!是不是
在告诉我,我的程序让编译器出了内部错误啊?我关掉delphi,再打开,Ctrl+F9,还是:
Internal error: L470 !!!不把那两行注释掉,编译一点也不错,但运行出错,注释
掉,编译就出错!!!我想注释掉两行在程序中还从未被使用的两行定义常量数组的语句
都不行,这不是要我死吗?我又把代码拷到其他机器上(纯源码,连res文件都不带),
Internal error: L470 错误是没有再出现了,可前面的错误依旧!(那两行常数定义还
没有注释掉,注释掉即好,加上又错,注释又好……)我的一个上午的时间就耗在这查错
上了,最后,你知道我是怎么解决的吗?我在那个出错的模块中的任意一个空行中敲了一
个空格,再Ctrl+F9,这个模块就重新编译了,生成了新的dcu,一切ok!再把那两行常数
定义加上,也好,倒!
我又反复试验,发现,只要那两行常数在,那个会出错的模块第一编译后生成的exe文件运
行到上面指出的地方100%出错,只要另这个模块重新编译(删除dcu或随便编辑一下源码),
100%ok!这是不是编译器的问题啊?我的程序都是标准控件,只有个第三方控件xlgrid1.7,
程序写法也没有错,会出这种问题,实在没法解释,为什么第一次编译出来的dcu就会出错
(两台机器上都这样)?

再回到自己的机器上,Internal error: L470 错误竟然奇迹般地消失了,另一个错误重新
编译就ok了,但我一个上午的时间就这样过去了!

我用D5。
 
我也遭遇到这个错误!不知道什么原因,经常第一次编译出现这个错误,再编译就好了!
我还以为是因为我们的pas代码太多了的原因呢(目前就只有pas代码大约有13万行)
 
13万行?什么程序啊?
 
经过老半天的排查,把不相关的代码都去掉了,大家看看下面的代码,有没有什么问题?
我想应该没有,请大家按下面给出的代码建立几个文本文件,用delphi5企业版打开,照
我说的做,应该都可以看到delphi编译器的bug,我已经在三台机器上重复出这个问题了!

=========Power.dpr :

program Power;

uses
Forms,
Power_DM in 'Power_DM.pas' {DM_Power: TDataModule},
Set_Frm in 'Set_Frm.pas' {Frm_set};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TDM_Power, DM_Power);
Application.CreateForm(TFrm_set, Frm_set);
Application.Run;
end.

=========Set_Frm.dfm :

object Frm_set: TFrm_set
Left = 324
Top = 161
BorderStyle = bsDialog
Caption = '数据库系统配置'
ClientHeight = 216
ClientWidth = 329
Color = clBtnFace
Font.Charset = GB2312_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = '宋体'
Font.Style = []
OldCreateOrder = False
Position = poOwnerFormCenter
Scaled = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 12
end

=========Set_Frm.pas :

unit Set_Frm;

interface

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

type
TFrm_set = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Frm_set: TFrm_set;

implementation

uses Power_DM;

{$R *.DFM}

procedure TFrm_set.FormCreate(Sender: TObject);
var
i:integer;
begin
with DM_Power do
begin
i:=length(SysDW);
setlength(SysDW,i+1);
SysDW.ID :=ADOQ_1.FieldByName('id').AsInteger ;
SysDW.Name :=trim(ADOQ_1.FieldByName('name').AsString) ;
end;
end;

end.

=========Power_DM.dfm :
object DM_Power: TDM_Power
OldCreateOrder = False
Left = 285
Top = 161
Height = 479
Width = 741
object ADOC: TADOConnection
Left = 202
Top = 128
end
object ADOQ_1: TADOQuery
Connection = ADOC
Parameters = <>
Left = 104
Top = 184
end
end

=========Power_DM.pas :
unit Power_DM;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, ADODB, ComCtrls, StdCtrls ;

const

// KqJzj_Edt_dw:array[0..7] of string=('Edt_30_002','Edt_30_003','Edt_30_004','Edt_30_005','Edt_30_006','Edt_30_007','Edt_30_009','Edt_30_010');
//将上面一行的注释去掉,Ctrl+F9编译通过,再把上面这行像现在一样注释掉,Ctrl+F9,
//出现 [Fatal Error] Internal error: L470 错误,这是Delphi编译器的Bug吗?
MinLevel:integer=1;

type
TSysDW=record
ID:integer;
Name:string;
end;
TDM_Power = class(TDataModule)
ADOC: TADOConnection;
ADOQ_1: TADOQuery;
private
{ Private declarations }
public
{ Public declarations }
end;

var
DM_Power: TDM_Power;
SysDW:array of TSysDW;

implementation

uses Set_Frm ;

{$R *.DFM}

end.
 
将 const 改写为变量试试!(最好为动态数组)
type KqJzj_Edt_dw=array[0..7] of string

type KqJzj_Edt_dw=array of string

var
dstr:KqJzj_Edt_dw;
onformshow()事件中
begin
setlength(dstr,8);
dstr[0]:=''
..
dstr[7]:='';
end;
onformclose()
begin
set dstr:=nil;
end;
end;
 
to kunmeng:
我只是想知道,这是不是delphi编译器的bug,这个问题我换个变量名就解决了,你照我
贴出的代码试过了吗,请你试试,我想知道是不是所有的delphi5.0的编译器都会有这个
错误。
 
我写程序的时候有时也会遇到这种问题(好几个月遇到一次吧)。我估计是Delphi使用的
对已编译过的函数、过程自动跳过的优化造成的。“我换个变量名就解决了”——这说明不
太可能是编译器的逻辑错误,Delphi有可能对代码进行分段Hash运算,每次编译时确定哪些
部分不必进行重复运算。
我前两年用Delphi写了一个小的网络游戏,服务器端代码增长到接近5000行时,程序中未
改动的部分出现了问题,跟踪来跟踪去,发现代码没有问题,是编译器的问题,最后只好统
统移植到VC6.0——痛苦呀!

——如果您用的是正版Delphi(问题就在这里呀...),完全可以向Borland公司发送造成
错的代码,能够得到官方的技术支持是最理想的。
哪位兄台用的是正版,帮帮忙?
 
可惜我也不是正版啊!

多谢creation-zy!

我是不是可以结贴了?
 
编译器也是会出问题的,要不然那么多补丁是干吗的?
VC++也不是没有问题,我用VC++时,我曾经遇到过类似的问题,
在某个很特殊的情况下,VC++编译总死机,改变变量名称或者改变代码,
就没有问题了。任何软件都是有BUG的,遇到这种情况,想办法变通避免
就可以了,毕竟这种情况是很少出现的,没必要和编译器叫劲。
 
但是,Delphi5企业版的所有补丁我都打了,而且,打补丁和没打补丁的D5都是一样的错误:
[Fatal Error] Internal error: L470
从help上看:
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.

可惜我不是正版用户!
TDataModule中的一个常数数组居然会引发这样的错误,呵呵呵,我可不是要和编译器叫劲,
发这个帖子,只是想让bbs上的富翁们帮忙看看,是不是个bug,如果是个bug的话,最好能
让borland的人知道就好了!一片好心啊!呵呵呵……
 
接受答案了.
 
>>编译器也是会出问题的,要不然那么多补丁是干吗的?
我是说编译器肯定会有问题,出补丁就是证明编译器有问题,但并不是打了补丁就能解决所有问
题问题,也不可能解决所有问题
>>但是,Delphi5企业版的所有补丁我都打了,而且,打补丁和没打补丁的D5都是一样的错误:
看来你的理解出了问题
 
顶部