Зацикливание процедуры. Крроктно ли?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Зацикливание процедуры. Крроктно ли?

Сообщение qivi » 16.12.2010 14:29:27

Код: Выделить всё
procedure TForm1.GeneraciyaProverka(Sender: TObject);  // Процедура проверки совпадений
  var n:integer;
begin
  RNDS:=RNDStroka;
  for n:=0 to RootNode.Count-1 do // Перебираем по порядку узлы первого уровня
  begin
    if RNDS=RootNode.Items[n].Text then GeneraciyaProverka(Sender);
  end;
end;


RNDStroka - функция возвращает произвольно сгенерированную строку.

Если на первом уровне трейвиева процедура находит узел совпадающий названием со вновь полученной строкой, процедура перевызывает сама себя. Коректно ли так делать?

Для эксперемента заменил RNDS:=RNDStroka; на RNDS:='kjgdkjwegkdwhgekhg';
Программа при выполнении процедуры тут же вылетела с ошибкой.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Зацикливание процедуры. Крроктно ли?

Сообщение Maxizar » 16.12.2010 16:22:57

Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    TreeView1: TTreeView;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private

   Function RNDStroka:String;
   procedure GeneraciyaProverka(Sender: TObject);  // Процедура проверки совпадений
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
  var n:integer;
      RNDS:String;
begin
  RNDS:='RNDStroka';
  TreeView1.Items.Add(nil,RNDS);
  for n:=0 to TreeView1.Items.Count-1 do // Перебираем по порядку узлы первого уровня
  begin
    if RNDS=TreeView1.Items[n].Text then Button1.Click;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
  var n:integer;
      RNDS:String;
begin
  RNDS:=RNDStroka;
TreeView1.Items.Add(nil,'54');
  for n:=0 to TreeView1.Items.Count-1 do // Перебираем по порядку узлы первого уровня
  begin
    if RNDS=TreeView1.Items[n].Text then Button2.Click;
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   GeneraciyaProverka(Sender);
end;

Function TForm1.RNDStroka: String;
begin
   Result:=IntToStr(Random(100));
end;

procedure TForm1.GeneraciyaProverka(Sender: TObject);
  var n:integer;
      RNDS:String;
begin
  RNDS:=RNDStroka;
TreeView1.Items.Add(nil,'54');      //А вдруг повезет и Рэндом поймает 54 :)
  for n:=0 to TreeView1.Items.Count-1 do // Перебираем по порядку узлы первого уровня
  begin
    if RNDS=TreeView1.Items[n].Text then GeneraciyaProverka(Sender);
  end;
end;
end.


У мну все корректно.. И еще че за ... Вы делаете?
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Зацикливание процедуры. Крроктно ли?

Сообщение qivi » 16.12.2010 17:02:55

У меня то же нормально, но когда я без вариантов зациклил процедуру (просто для проверки): RNDS:='kjgdkjwegkdwhgekhg';, программа вылетает с ошибкой при выполнении этой процедуры. Вот и давят сомнения а вообще так можно делать, вызывать процедуру из самой себя (теоретически вероятность очень низкая, но всё же кто знает сколько раз она зациклится)?
У меня RNDS глобальная.

Что б было понятно, эта процедура вызывается при добавлении нового объекта для генерации его уникального идентификатора, ну и соответственно проверяет его уникальность.

И еще че за ... Вы делаете?

Пока скромно промолчу :oops:
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Зацикливание процедуры. Крроктно ли?

Сообщение FedeX » 16.12.2010 17:23:29

Коректно ли так делать?

Я так понял обычная рекурсия? Что же сдесь может быть некорректного? Если предполагаеться возможность что RNDStroka будет постоянно генерировать уже присутствующее значение и рекурсия может стать бесконечной - просто "разверните" её (рекурсию) в цикл и делайте проверку на то, не превышает ли количество уже сгенерированных значений, количество возможных значений, генерируемых RNDStroka
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 33

Рейтинг@Mail.ru