用于排序数组的自定义过程

时间:2014-10-15 14:01:53

标签: delphi delphi-7

我正在阅读一篇旧的试卷,为我的决赛做准备,为了对生活的热爱,我无法弄清楚如何做到这一点! 该程序工作较早,但它没有对数组进行排序。现在我收到错误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 listMake new textfile with listSort list alphabetically。我正在处理的按钮是对列表进行排序。这个问题文件说我必须制作一个sort procedure,并且必须在点击Sort Button时调用。

感谢您的任何建议/帮助

P.S。

请你指点一个链接,他们会深入解释选择排序 - 逻辑不在我身上......

1 个答案:

答案 0 :(得分:3)

您没有初始化iCount。所以它是0.因此iCount-1-1。但是,对于循环变量,使用Byte(无符号类型)。现在,-1在被解释为无符号Byte时为255。如果你完全遵循这一点意味着你访问数组越界。事实上,内部循环只执行一次,l的值等于0k等于255

如果您启用范围检查编译器选项,则在运行数组末尾时会遇到运行时错误。

据推测,您希望将iCount初始化为某个值。我不知道是什么,但你会知道。

除此之外,停止对循环变量使用无符号类型。将Byte替换为Integer