我正在阅读一篇旧的试卷,为我的决赛做准备,为了对生活的热爱,我无法弄清楚如何做到这一点!
该程序工作较早,但它没有对数组进行排序。现在我收到错误EAccess violation with message: access violation at address 00404BDE
这是我的代码(它有点长,也许你可以帮助我发现我的错误):
private
{ Private declarations }
iCount : Integer;
arrDams : array [1..200] of string;
Procedure List;
procedure Display;
procedure Sort;
procedure Search (sDam : String);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Display; //Display with Numbers
var
k : Integer;
begin
for K := 1 to 200 do
begin
RedOut.Lines.Add (IntToStr(k) + '.) ' + (arrDams[k]));
end;
end;
procedure TForm1.FormCreate(Sender: TObject); // Create
begin
//
end;
procedure TForm1.List; // TextFile to array
var
MyFile : TextFile;
k : Integer;
begin
If FileExists('Dams.txt') <> True
then Application.Terminate;
AssignFile (MyFile, 'Dams.txt');
Reset(MyFile);
For K := 1 to 200 do
begin
Readln(MyFile, arrDams[k])
end;
end;
procedure TForm1.Search(sDam: String); // Search
begin
end;
procedure TForm1.Sort; // Sort;
var
K,L : byte;
sKeep : string;
begin
for k := 1 to iCount -1 do
begin
for l := k + 1 to iCount do
begin
if arrDams[k] > arrDams[L] then
begin
sKeep := arrDams[k];
arrDams[k] := arrDams[L];
arrDams[L] := sKeep
end;
end;
end;
end;
procedure TForm1.btnListClick(Sender: TObject);
begin
List;
Display;
end;
procedure TForm1.btnDisplayClick(Sender: TObject);
begin
display;
sort;
end; //<---------- ERROR OVER HERE!
end.
表单顶部的Theres 3按钮,即Show list
,Make new textfile with list
和Sort list alphabetically
。我正在处理的按钮是对列表进行排序。这个问题文件说我必须制作一个sort procedure
,并且必须在点击Sort Button
时调用。
感谢您的任何建议/帮助
P.S。
请你指点一个链接,他们会深入解释选择排序 - 逻辑不在我身上......
答案 0 :(得分:3)
您没有初始化iCount
。所以它是0.因此iCount-1
是-1
。但是,对于循环变量,使用Byte
(无符号类型)。现在,-1
在被解释为无符号Byte
时为255
。如果你完全遵循这一点意味着你访问数组越界。事实上,内部循环只执行一次,l
的值等于0
且k
等于255
。
如果您启用范围检查编译器选项,则在运行数组末尾时会遇到运行时错误。
据推测,您希望将iCount
初始化为某个值。我不知道是什么,但你会知道。
除此之外,停止对循环变量使用无符号类型。将Byte
替换为Integer
。