Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2012, 23:11   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Смущение Рекурсия и локальный массив

Доброго времени суток!

Строча функцию на тему случайного отбора файла из каталога, всплыла проблема.

Задачка:
Выбрать файлы определенного типа из каталога и его подкаталогов, и загнать их в 1 массив, затем рандомно выбрать 1 из них.

Траблы:
1. Массив объявлен как локальная переменная, каждый новый рекурсивный вызов создает новый экземпляр массива?
2. Если создать массив глобально, траблы будут?

Есть идеи?

Человек_Борща вне форума Ответить с цитированием
Старый 03.10.2012, 23:15   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

1. да
2. нет

> Есть идеи?

3. передавать указатель на массив в рекурсивную функцию
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 03.10.2012, 23:37   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
> Есть идеи?
я за глобальный массив + использовать динамические структуры (например, TStringList)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.10.2012, 00:16   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Взял в оборот глобальную переменную, полет нормальный =)

veniside, в тол не возьму ваш 3-й пункт. Как работать в первом вызове(самом первом)?
Код:
type
  TmyArray = array of string;
  PmyArray=^TmyArray;

procedure Recursive(aString:string; var aP:PmyArray = nil);
var
  aImgs:TMyArray;
begin
  Recursive('...',@aImgs);
 if Assigned(aP) then  //Если aP не nil :-/
  AP[...]:= ...;
  else
  aImgs[...]:=...;
end;
Так что-ли?
В любом случае ваш вариант, пока писал, понял что он не подходит под мою задачу:
Их полученного массива выбрать случайный элемент. << - этот пункт выполняется последним.
Человек_Борща вне форума Ответить с цитированием
Старый 04.10.2012, 07:04   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Когда-то написал такую процедурку
Код:
procedure ListFiles(Path, Ext: string; Level: Byte; const SL: TStringList;
  UseFullName: Boolean = False; WithSize: Boolean = False);
var
  SR: tsearchrec;
  dir, s: string;
begin
  Path := IncludeTrailingPathDelimiter(Path);
  if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
    repeat
      if (SR.Name = '.') or (SR.Name = '..') then
        Continue;
      if UseFullName then
        dir := Path
      else
        dir := '';
      if WithSize then
        s := Delim + IntToStr(SR.Size)
      else
        s := '';
      if (Level > 0) and ((SR.Attr and faDirectory) <> 0) then
        ListFiles(Path + SR.Name, Ext, Level - 1, SL, UseFullName, WithSize)
      else if Pos(Ext, SR.Name) <> 0 then
        SL.Add(dir + SR.Name + s);
    until FindNext(SR) <> 0;
  FindClose(SR);
end;
Работает так: Даём путь и расширение файла (в принципе можно на маску даже переделать), глубину поиска, стринглист для резалтов (предв. создаём, конечно) и флаги - вписывать полные имена файлов либо только сами имена, и вписывать ли размер (при этом имя и размер в байтах разделяются Delim'итером который задаём константой, а потом по этому же делиму пилим при показе результатов на имя и размер)

Особо не тестил, но в проге, где применял, работала, давая искомый резалт.

Осн. мысль простая - зачем массив и запарки со стеком, если есть вменяемая куча.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Локальный таймер Anton911 Общие вопросы Delphi 11 13.01.2012 10:46
рекурсия и массив Sparky Помощь студентам 3 18.03.2011 23:39
задача паскаль, скорее всего массив+рекурсия(хотя у меня другой способ) IvaniuS Помощь студентам 10 23.12.2009 15:34
Локальный чат. GAGARIN-NEW Софт 0 12.12.2007 22:43