
19.04.2014, 14:43
|
Прохожий
|
|
Регистрация: 03.03.2014
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
|
|
сортировка массивов
в втором Memo выводит лишний 0. Почему????????
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Label4: TLabel;
Label5: TLabel;
Button1: TButton;
Memo1: TMemo;
Memo2: TMemo;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TThread1 = class(TThread)
public
res : array of integer;
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
protected
procedure Execute; override;
end;
TThread2 = class(TThread)
public
res : array of integer;
constructor Create(CreateSuspended: Boolean);
destructor Destroy; override;
protected
procedure Execute; override;
end;
var
Form1: TForm1;
a: array of integer;
n: integer;
implementation
{$R *.dfm}
constructor TThread1.Create(CreateSuspended: Boolean);
begin
inherited; // Запуск родительского конструктора
Setlength(res,n+2); // Подготовка массива
end;
constructor TThread2.Create(CreateSuspended: Boolean);
begin
inherited; // Запуск родительского конструктора
Setlength(res,n+2); // Подготовка массива
end;
destructor TThread1.Destroy;
begin
SetLength(res, 0); // Удаление массива из памяти
res := nil;
inherited; // Вызов родительского деструктора
end;
destructor TThread2.Destroy;
begin
Setlength(res,0); // Удаление массива из памяти
res := nil;
inherited; // Вызов родительского деструктора
end;
procedure TThread1.Execute;
var i,j,x: Integer;
begin
for i:=0 to n-1 do
res[i]:=a[i];
for i := 0 to n-1 do
for j := 0 to n-1 do
if res[j] < res[j+1] then
begin
x := res[j+1];
res[j+1] := res[j];
res[j] := x;
end;
end;
procedure TThread2.Execute;
var i,j,x: Integer;
begin
for i:=0 to n-1 do
res[i]:=a[i];
for i := 0 to n-1 do
for j := 0 to n-1 do
if res[j] > res[j+1] then
begin
x := res[j+1];
res[j+1] := res[j];
res[j] := x;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
T1 : TThread1;
T2 : TThread2;
i,t:integer;
begin
val(Edit1.Text, n, t);
if t>0 then
begin
showmessage('неверный формат или поле не заполнено');
exit;
end;
Setlength(a,n+2);
For i := 0 To n-1 Do
a[i]:= Random(100);
T1 := TThread1.Create(True);// создает экземпляр класса
T2 := TThread2.Create(True);
T1.Resume;//запуск потока
T2.Resume;
T1.WaitFor;;// ждет завершения потока, возвращая затем код его завершения
T2.WaitFor;
For i := 0 To n-1 Do
Memo1.Lines.Add(IntToStr(T1.res[i]));
For i := 0 To n-1 Do
Memo2.Lines.Add(IntToStr(T2.res[i]));
T1.Free; //освобождение памяти выделенной под экземпляр класса
T2.Free;
end;
end.
|