我创建了一个简单的表单,允许最终用户添加名称。当我使用整数时(即向最终用户询问整数,它是添加到列表,然后列表框中的所有整数都被排序),程序工作正常。我现在正在尝试使字符串工作(即询问名称,将其添加到列表框,并在单击排序时,它运行插入排序)。它编译好,但是,我总是得到一个运行时错误“模块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.
答案 0 :(得分:3)
最明显的问题是您混合了一个基于零和基于零的数组索引。开放阵列基于零。你的阵列是基于一个。你没有考虑到这种差异。
考虑到差异并不是前进的方向。混合惯例导致大规模混淆。选择一个约定并坚持下去。由于Delphi设计人员已经选择零基于开放阵列和动态阵列,因此选择很明确。始终使用基于零的数组。
请注意,实际上并不需要传递第一个和最后一个数组索引。您可以找到包含low()
和high()
的开放数组的第一个和最后一个索引。
While (list[index] > currentValue) and (index >= 0)
这种情况是错误的。在访问阵列之前,您需要测试index
是否为正。
While (index >= 0) and (list[index] > currentValue)
您确实需要将排序代码与GUI分开。这样你就可以重复使用排序代码了。
变量名count
是循环变量的错误选择。我们使用该名称来表示集合中的项目数。
可能会有更多错误。您应该能够使用调试器找到它们。