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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2013, 17:28   #11
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Airhand Посмотреть сообщение
При рекурсии юзается стек статической памяти (я точно не помню, но что-то около 64 килобайт; сравните с динамической, которой могут быть гигабайты).
Стека тоже могут быть гигабайты. По умолчанию под Windows - 1МБ.

Зато обычно скорость выполнения рекурсии + стек обычно выше, чем если использовать динамическую память.

Были времена, когда на компах было действительно 1-2К стека и 64К памяти - тогда действительно на рекурсии далеко не уедеш. Увы, эти времена далеко в прошлом.
waleri вне форума Ответить с цитированием
Старый 25.05.2013, 19:53   #12
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Стека тоже могут быть гигабайты. По умолчанию под Windows - 1МБ.

Зато обычно скорость выполнения рекурсии + стек обычно выше, чем если использовать динамическую память.

Были времена, когда на компах было действительно 1-2К стека и 64К памяти - тогда действительно на рекурсии далеко не уедеш. Увы, эти времена далеко в прошлом.
Стек тоже разным бывает: открываем C++Builder/Project/Options…/Linker. Видим min stack size – 8kb; max stack size – 1024kb (1 Mb). И где гигабайты ?
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Старый 26.05.2013, 18:40   #13
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Airhand
О чём речь вообще идёт? Если ты понимаешь, что такое стек, то вызов функции с целочисленным аргументом потребует от стека всего 8 байт. Столько же уйдёт для его вызова с указателем на самую хитрую структуру. Т.е., функция может самовызываться тысячи раз без особых проблем. Для большинства целей этого предостаточно.
FataLL вне форума Ответить с цитированием
Старый 27.05.2013, 09:55   #14
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

Цитата:
Сообщение от FataLL Посмотреть сообщение
Airhand
О чём речь вообще идёт? Если ты понимаешь, что такое стек, то вызов функции с целочисленным аргументом потребует от стека всего 8 байт. Столько же уйдёт для его вызова с указателем на самую хитрую структуру. Т.е., функция может самовызываться тысячи раз без особых проблем. Для большинства целей этого предостаточно.
Есть динамический стек (которого на 32 битной системе около 3.5 гигабайт), а есть стек вызовов (которого около 1 мегабайта). Вот о финальном речь и идёт: в него помимо названий функций (а они компилером именуются иначе) ещё добавляются аргументы функций (фактические). Он всего лишь 1 мегабайт, вот его может и не хватить.
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Старый 27.05.2013, 10:24   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Размер стека в Windows ограничен только адресным пространством процесса.
waleri вне форума Ответить с цитированием
Старый 27.05.2013, 13:03   #16
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Цитата:
Сообщение от Airhand Посмотреть сообщение
в него помимо названий функций (а они компилером именуются иначе) ещё добавляются аргументы функций (фактические). Он всего лишь 1 мегабайт, вот его может и не хватить.
В стек записывается только адрес возврата и аргументы, без всяких названий. Некоторые аргументы вообще передаются в регистрах. И если не создавать локальные массивы бешеных размеров, то стека вполне хватит.
FataLL вне форума Ответить с цитированием
Старый 29.05.2013, 09:49   #17
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Что-то с глубиной вложения не получается сделать,года 3 назад делал на Делфи, а сейчас на С++ не могу найти примеры.
Т.е. непонятно в какое место у рекурсивной функции надо вставлять это счетчик, я пробовал писать glubina++ там где проверяется каталог с "." и "..",но по-моему неверно работает.Ищет либо только в корне,либо всё по максимуму
calypso вне форума Ответить с цитированием
Старый 29.05.2013, 09:56   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
void ListFiles(AnsiString path, TStrings* List, int depth)
{
if (!depth)
  return;
TSearchRec sr;
if (FindFirst(path+"*.*", faAnyFile, sr) == 0)
{
 do
 {
 if (sr.Attr & faDirectory)
  {
  if (sr.Name!=".")
  if (sr.Name!="..")
   {
	AnsiString Ext=ExtractFileExt(sr.Name).UpperCase();
   if ((Ext==".avi") | (Ext==".wmv") | (Ext==".mpg")|(Ext==".mp4"))
   List->Add(path+sr.Name);
   else ListFiles(path+sr.Name+"\\",List, depth - 1);// Рекурсивный вызов
   }
   }
 }
 while (FindNext(sr) == 0);
 FindClose(sr);
}
Application->ProcessMessages();
}
Вызываете с depth = 3 - получаете вложенность 3 (по идее ).
Кстати, какой-то странный код.
Мне кажется, что правильнее:
Код:
void
ListFiles(AnsiString path, TStrings* List, int depth)
{
    if (!depth)
      return;
    TSearchRec sr;
    if (FindFirst(path+"*", faAnyFile, sr) == 0)
        do {
            if (sr.Attr & faDirectory) {
                if (sr.Name != "." && sr.Name != "..")
                    ListFiles(path+sr.Name+"\\",List,depth - 1);
            } else {
                AnsiString Ext=ExtractFileExt(sr.Name).UpperCase();
                if (Ext==".AVI" || Ext == ".WMV" || Ext==".MPG" || Ext == ".MP4")
                    List->Add(path+sr.Name);
            }
        } while (FindNext(sr) == 0);
        FindClose(sr);
    Application->ProcessMessages();
}
И да, код не тестировался, так что возможны неточности.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 29.05.2013 в 10:06.
BDA на форуме Ответить с цитированием
Старый 29.05.2013, 10:54   #19
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Ну да,второй вариант работает и он более правильный.Я не догадался,что глубину надо использовать как переменную самой функции, т.к. если ее просто обнулять внутри ListFiles то рекурсивный вызов правильно работает только 1-й раз.
calypso вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файлов по маске и нахождения общего размера найденных файлов и вывод в терминал Колямбий Помощь студентам 0 21.04.2013 21:31
C#.LINQ Генерация всех перестановок без рекурсии Lasur Помощь студентам 2 08.04.2012 19:38
Рекурсивный поиск файлов в интервале дат(без времени,только день,месяц и год)) AlexKhol Общие вопросы Delphi 3 04.02.2012 16:15
А нужно без рекурсии Kazik Общие вопросы Delphi 1 22.05.2010 12:20
С помощью рекурсии без операторов цикла и перехода написать процедуру P(N) WhyBeNormal Помощь студентам 1 29.01.2009 01:20