Delphi插入排序ListBox运行时错误。

时间:2014-12-13 14:22:42

标签: delphi

我创建了一个简单的表单,允许最终用户添加名称。当我使用整数时(即向最终用户询问整数,它是添加到列表,然后列表框中的所有整数都被排序),程序工作正常。我现在正在尝试使字符串工作(即询问名称,将其添加到列表框,并在单击排序时,它运行插入排序)。它编译好,但是,我总是得到一个运行时错误“模块KernelBase.dll中的[长十六进制数]访问冲突”。 Errggh!

  unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    btnAdd: TButton;
    txtEdit: TEdit;
    ListBox: TListBox;
    btnSort: TButton;
    Label1: TLabel;
    procedure btnAddClick(Sender: TObject);
    procedure btnSortClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure InsertionSort(var list: array of string;first,last:integer);
  end;

var
  Form4: TForm4;
  List: array [1..10] of string;

implementation

{$R *.dfm}

procedure tform4.insertionSort(var list: array of string; first,last:integer);
var CurrentIndex, Index,count:integer; CurrentValue: string;
begin
    CurrentIndex:=first+1;
    while CurrentIndex <= last do
    begin
       currentValue:=list[CurrentIndex];
       Index:=CurrentIndex-1;
       While (list[index] > currentValue) and (index >= 0)
       do
        begin
            list[Index+1]:= list[Index];
            Index:=Index-1;
        end;
        list[index+1]:=currentValue;
        CurrentIndex:=CurrentIndex+1;
    end;
    listbox.Clear;
    for count := 1 to length(list) do
          listbox.Items.Add((list[count]));
end;

procedure TForm4.btnAddClick(Sender: TObject);
begin
listbox.Items.Add(txtEdit.Text);
txtEdit.Text:='';
end;

procedure TForm4.btnSortClick(Sender: TObject);
var last:integer;
begin
 last:=length(list);
 showmessage(inttostr(last));
 insertionSort(list, 1, last);
end;

procedure TForm4.FormCreate(Sender: TObject);
var step:integer;
begin
for step := 1 to length(list) do
  listbox.Items.Add((list[step]));
end;

 begin
    list[1]:='Zulu';
    list[2]:='Yankee';
    list[3]:='XRay';
    list[4]:='Whiskey';
    list[5]:='Victor';
    list[6]:='Uniform';
    list[7]:='Tango';
    list[8]:='Sierra';
    list[9]:='Romeo';
    list[10]:='Quebec';
end.

1 个答案:

答案 0 :(得分:3)

最明显的问题是您混合了一个基于零和基于零的数组索引。开放阵列基于零。你的阵列是基于一个。你没有考虑到这种差异。

考虑到差异并不是前进的方向。混合惯例导致大规模混淆。选择一个约定并坚持下去。由于Delphi设计人员已经选择零基于开放阵列和动态阵列,因此选择很明确。始终使用基于零的数组。

请注意,实际上并不需要传递第一个和最后一个数组索引。您可以找到包含low()high()的开放数组的第一个和最后一个索引。

While (list[index] > currentValue) and (index >= 0)

这种情况是错误的。在访问阵列之前,您需要测试index是否为正。

While (index >= 0) and (list[index] > currentValue)

您确实需要将排序代码与GUI分开。这样你就可以重复使用排序代码了。

变量名count是循环变量的错误选择。我们使用该名称来表示集合中的项目数。

可能会有更多错误。您应该能够使用调试器找到它们。