![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() понял... спасибо
|