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

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

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

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

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

Сообщение qivi »

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

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';
Программа при выполнении процедуры тут же вылетела с ошибкой.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

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

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.


У мну все корректно.. И еще че за ... Вы делаете?
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

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

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

Пока скромно промолчу :oops:
Аватара пользователя
FedeX
постоялец
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Сообщение FedeX »

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

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