최종 사용자가 이름을 추가 할 수있는 간단한 양식을 만들었습니다. 이 프로그램은 정수를 사용할 때 정상적으로 작동합니다 (즉, 최종 사용자에게 정수를 물어 보면 목록에 추가 된 다음 목록 상자의 모든 정수가 정렬되었습니다). 이제 Strings를 작동 시키려고합니다. 즉, 이름을 물어보고 목록 상자에 추가하고 정렬을 클릭하면 삽입 정렬이 실행됩니다. 그것은,하지만, 난 항상 모듈 KernelBase.dll에서 "긴 16 진수 번호에서 액세스 위반"런타임 오류가 발생하고있어, 괜찮아요 컴파일합니다. 어!Delphi 삽입 정렬 ListBox 런타임 오류.
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.
'InsertionSort'는'문자열 배열'에서 동작합니다. 이것은 목록 색인이 0에서 시작 함을 의미합니다. 먼저 통과하고 있습니다. 1을 기준으로 중지하십시오. –
큰 문제는 색인 기반에 대한 혼란으로 보입니다. 귀하의 코드에는 1을 기준으로 한 지표와 0을 기준으로 한 지표가 혼합되어 있습니다. 그러지 마. 어디에서나 0을 사용하십시오. –
죄송합니다, 삽입 지점 정렬 절차에서 다음 줄을 따로 따로 1 기반으로 붙어 있다고 생각하므로 죄송합니다. _While (list [index]> currentValue) 및 (index> = 0) _ 나는 삽입 정렬 알고리즘의 실제적인 부분이라고 생각한다. – user3396486