Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.04.2014, 14:43
labuda labuda вне форума
Прохожий
 
Регистрация: 03.03.2014
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию сортировка массивов

в втором Memo выводит лишний 0. Почему????????



Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
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  
Старый 19.04.2014, 15:30
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от labuda
в втором Memo выводит лишний 0. Почему????????
А у тебя оба потока без синхронизации обращаются к одному и тому же глобальному массиву? Тогда нет ничего удивительного в получении неожиданных результатов.
Ответить с цитированием
  #3  
Старый 20.04.2014, 00:40
labuda labuda вне форума
Прохожий
 
Регистрация: 03.03.2014
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию ?????

а как синхронизировать то не подскажете?
Ответить с цитированием
  #4  
Старый 20.04.2014, 01:01
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от labuda
а как синхронизировать то не подскажете?
Например заполнять локальные массивы потоков из глобального массива за пределами потоков, хотя бы в том же Button1Click.
Впрочем в твоём случае это не поможет избежать появления лишнего нуля, так как проблема в другом - в выходе за пределы массива - цикл нужно организовать не до последнего элемента массива, а до предпоследнего (так как выполняется сравнение текущего элемента со следующим), вот так:
Код:
1
for j := 0 to n-2 do
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
labuda (20.04.2014)
  #5  
Старый 20.04.2014, 01:20
labuda labuda вне форума
Прохожий
 
Регистрация: 03.03.2014
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

понял... спасибо
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:32.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025