![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
в втором 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. |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
|||
|
|||
|
а как синхронизировать то не подскажете?
|
|
#4
|
||||
|
||||
|
Цитата:
Впрочем в твоём случае это не поможет избежать появления лишнего нуля, так как проблема в другом - в выходе за пределы массива - цикл нужно организовать не до последнего элемента массива, а до предпоследнего (так как выполняется сравнение текущего элемента со следующим), вот так: Код:
for j := 0 to n-2 do |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
labuda (20.04.2014)
| ||
|
#5
|
|||
|
|||
|
понял... спасибо
|