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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.04.2014, 14:43
labuda labuda вне форума
Прохожий
 
Регистрация: 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.
Ответить с цитированием
  #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.
Впрочем в твоём случае это не поможет избежать появления лишнего нуля, так как проблема в другом - в выходе за пределы массива - цикл нужно организовать не до последнего элемента массива, а до предпоследнего (так как выполняется сравнение текущего элемента со следующим), вот так:
Код:
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
По умолчанию

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


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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