DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: laidabin
今日帖子: 1
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 wojiaohaoyaping (我叫郝亚平) ▲▲▲▲△ -
普通会员
2016/8/17 14:06:42
标题:
Delphi Berlin:List index out of bounds(0) 浏览:1628
加入我的收藏
楼主: type
  TEntry = record
     TimeCode: Integer; 
     LineIndex: Integer;
  end;

var
  FDataList: TStrings;
  FData: array of TEntry;

FDataList, FData 都已经处理有数据了。

function TDataParser.GetDataString(AIdx: Integer): string;
var
  Tmp: string;
begin
  Tmp := '';
  if Assigned(FDataList) then
  begin
    // 在 Delphi 10.1 Berlin 中,报错EStringListError -- 
    //  List index out of bounds(0)
    //(并且仅仅在 Release下报错,而在 DEBUG 下不报错)。

    // 在 Delphi 10 Seattle Update1 下,不报错(Release,Debug都正常)
    // WHY ???怎么回事 

    if (AIdx >= 0) and (Length(FData) > 0) then
      if FData[AIdx].LineIndex >= 0 then
        Tmp := FDataList[FData[AIdx].LineIndex];
  end;
    Result := Tmp;
end;
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/8/17 15:45:55
1楼: 信息不足,哪一行报错?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 wojiaohaoyaping (我叫郝亚平) ▲▲▲▲△ -
普通会员
2016/8/17 15:49:53
2楼: Debug 模式,不会报错。找不到错误。
但是,用 Release 模式编译,运行就会报错。就这个 GetDataString 报错。
因为当我把这个代码注释掉:
Tmp := FDataList[FData[AIdx].LineIndex];
Delphi Berlin 就 Release模式下不报错了。
感觉,挺奇怪的。 

Delphi Seattle 不存在这个报错问题。
----------------------------------------------
-
作者:
男 wojiaohaoyaping (我叫郝亚平) ▲▲▲▲△ -
普通会员
2016/8/17 16:04:28
3楼: 已经退回使用 Delphi Seattle 吧。不会出现这个报错。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2016/8/17 16:12:03
4楼: unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TEntry = record
     TimeCode: Integer;
     LineIndex: Integer;
  end;

var
  FDataList: TStrings;
  FData: array of TEntry;

function GetDataString(AIdx: Integer): string;
var
  Tmp: string;
begin
  Tmp := '';
  if Assigned(FDataList) then
  begin
    // 在 Delphi 10.1 Berlin 中,报错EStringListError --
    //  List index out of bounds(0)
    //(并且仅仅在 Release下报错,而在 DEBUG 下不报错)。

    // 在 Delphi 10 Seattle Update1 下,不报错(Release,Debug都正常)
    // WHY ???怎么回事

    if (AIdx >= 0) and (Length(FData) > 0) then
      if FData[AIdx].LineIndex >= 0 then
        Tmp := FDataList[FData[AIdx].LineIndex];
  end;
    Result := Tmp;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDataList := TStringList.Create;
  FDataList.Add('test');

  SetLength(FData, 1);
  FData[0].TimeCode := 0;
  FData[0].LineIndex := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FreeAndNil(FDataList);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GetDataString(0));
end;

end.


RAD10.1 柏林 release 没有发生错误。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 brh616 (风风风) ★☆☆☆☆ -
盒子活跃会员
2016/8/18 8:25:20
5楼: 不管用哪个版本,错误都是存在的,只是没有报而已。而是否报错,和设置有关系,你检查一下project options里面的Compiling>>Runtime error, Range check,勾上就报,不勾上不报错。错误还是存在的,检查代码吧。
----------------------------------------------
风风风
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2016/8/18 14:06:06
6楼: 不是不报,时候未到。
时候一到,一切都报。
----------------------------------------------
-
作者:
男 bjeco (eco) ▲▲▲▲△ -
普通会员
2016/8/18 15:16:31
7楼: function GetDataString(AIdx: Integer): string;
var
  Tmp: string;
begin
  Tmp := '';
  if Assigned(FDataList) then
  begin
    // 在 Delphi 10.1 Berlin 中,报错EStringListError --
    //  List index out of bounds(0)
    //(并且仅仅在 Release下报错,而在 DEBUG 下不报错)。

    // 在 Delphi 10 Seattle Update1 下,不报错(Release,Debug都正常)
    // WHY ???怎么回事

    if (AIdx >= 0) and (Length(FData) > 0) then
      if FData[AIdx].LineIndex >= 0 then
        Tmp := FDataList[FData[AIdx].LineIndex];
  end;
    Result := Tmp;
end;
楼主有二处检查条件不够:
 if (AIdx >= 0) and (AIdx < Length(FData)) then
   if (FData[AIdx].LineIndex >= 0) and (FData[AIdx].LineIndex<Length(FDataList)then
      Tmp := FDataList[FData[AIdx].LineIndex];
建议楼主加强代码的可读性
----------------------------------------------
-
作者:
男 wojiaohaoyaping (我叫郝亚平) ▲▲▲▲△ -
普通会员
2016/8/18 16:34:05
8楼: 我换回 Seattle 好了。
下次换回 Berlin 后,我再好好测试下。究竟是什么原因。感谢。
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2016/8/18 16:54:14
9楼: 我以前用XE2写过一个DLL,debug下用C#调用没有问题,release后就报错。
然后同样的代码用Delphi7编译,也没有问题。

不过楼主的代码代码如7楼所说,有很大缺陷.7楼都给改了。
----------------------------------------------
-
作者:
男 littlestone08 (littlestone08) ★☆☆☆☆ -
普通会员
2016/8/22 21:07:29
10楼: 关注 明天试下 另外几位层主 楼主这样写离该是为了让问题代码更突出才这样省略写的demo吧
 挑问题有点歪楼了
----------------------------------------------
我和我追逐的梦,擦肩而过
作者:
男 littlestone08 (littlestone08) ★☆☆☆☆ -
普通会员
2016/8/23 6:45:46
11楼: 好吧,试过了,DELPHI10.1未发生错误。楼主你的问题不会是在这段代码中。

瞬间我得楼主可恶了,不仔细,看来混技术饭的人说话也不都是靠谱的
----------------------------------------------
我和我追逐的梦,擦肩而过
作者:
男 wojiaohaoyaping (我叫郝亚平) ▲▲▲▲△ -
普通会员
2016/8/23 19:10:27
12楼: 各位费心了。呵呵。
----------------------------------------------
-
作者:
男 gregma (gregma) ★☆☆☆☆ -
普通会员
2016/8/24 14:29:50
13楼: 本来就是。对各种报bug,我都是抱着怀疑的态度。出了错,很多时候都是自己的问题。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行72.26563毫秒 RSS