none
stack overflow в рекурсивной функции RRS feed

  • Вопрос

  • Подскажите пожалуйста, компилятор ругается на слишком глубокую или бесконечную рекурсию.

    Пытался реализовать поиск:

    есть объект класса директория, в котором содержится список объектов класса файл, которые находятся в этой директории, и ещё один список со вложенными директориями

    создал метод для поиска, в нём обычным foreach'ем перебираю список вложенных папок

    и для каждой рекурсивно вызываю этот метод

    после уже по списку файлов через .Find ищу нужные объекты

    (вероятно в итоге получу новый список с результатами поиска)

     

    Т.е. предполагается, что функция доходит до "дна" и начинает искать файлы, а потом возвращается выше.

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

     

    Заранее благодарю.

     


Ответы

  • foreach (STFDir dir in curdir.DirList)
    {
        search_file_name(curdir);
    }

    Вы здесь не ту переменную передаете - вместо curdir, нужно dir.

    • Помечено в качестве ответа Kenaut 25 мая 2011 г. 9:29
    Отвечающий

Все ответы

  • Проблема в коде, работа в файлами конечная операция и никаких overflow не должно быть. Напишите сюда как вы делаете рекурсию и как делаете поиск.
    Отвечающий
  • Если нужно найти файл в директории или другую директорию, можно и не изобретать велосипед, а просто воспользоваться System.IO.Directory.GetFiles() или System.IO.Directory.GetDirectories()
  • Проблема в коде, работа в файлами конечная операция и никаких overflow не должно быть. Напишите сюда как вы делаете рекурсию и как делаете поиск.

    Спасибо за ответ, вот что-то вроде такого:

        private void search_file_name(STFDir curdir)
        {
          foreach (STFDir dir in curdir.DirList)
          {
            search_file_name(curdir);
          }
          List<STFFile> res = curdir.FileList.FindAll(delegate(STFFile file)
          {
            return file.Name == "test.stf";
          });
        }
    

    при том аналогичная функция в другом месте уже используется (заполняет узлами TreeView) и ошибок не порождает

    a_pLuton, спасибо, про эти классы я в курсе, но мне нужны не столько конечные файлы и папки, сколько те объекты, которые у меня используются для их представления

  • Стэк трейс ошибки в студию! :)
    Don't forget to vote for useful replies and/or mark answers for your questions - that helps other guys to find the answer faster.
  • Стэк трейс ошибки в студию! :)
    Don't forget to vote for useful replies and/or mark answers for your questions - that helps other guys to find the answer faster.

    проблема в том, что закончился стек точек возврата, у него размер 256 и этот размер невозможно увеличить, в таких случаях предлагают вместо рекурсивного вызова вызывать себя в другом потоке и следом после старта Join'ить этот поток.

    в общем есть над чем подумать...

    • Изменено Kenaut 25 мая 2011 г. 5:39 нагуглил
    • Предложено в качестве ответа Dmitry Pavlov 25 мая 2011 г. 8:04
    • Отменено предложение в качестве ответа Kenaut 25 мая 2011 г. 9:19
  • foreach (STFDir dir in curdir.DirList)
    {
        search_file_name(curdir);
    }

    Вы здесь не ту переменную передаете - вместо curdir, нужно dir.

    • Помечено в качестве ответа Kenaut 25 мая 2011 г. 9:29
    Отвечающий
  • от жеж epic fail блин =) спасибо чтоли...

    это из-за дурацкого насморка всё, постараюсь быть более внимательным в дальшейшем =) ещё раз спасибо

    но всё равно постараюсь разобраться с потоками - пригодится, тем более, что вложенность может оказаться, действительно, большой