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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2015, 18:22   #1
hooko
Пользователь
 
Аватар для hooko
 
Регистрация: 04.05.2012
Сообщений: 13
По умолчанию Динамический массив строк

Привет народ! Надо найти файлы в заданном каталоге. Задача такова что, мне нужно записать все полные пути файлов в массив. Так как я не знаю заранее сколько файлов будет, решил использовать динамические массивы. Вот моя процедура:

Код:
procedure ScanDir(StartDir: string; Mask: string; list: array of string);
var
   SearchRec: TSearchRec;
   i: integer;
begin
   i:= 0;
   if Mask = '' then
     Mask := '*.*';

   if StartDir[Length(StartDir)] <> '\' then
     StartDir := StartDir + '\';

   if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
     begin
       repeat
         if (SearchRec.Attr and faDirectory) <> faDirectory then //если не папка
           begin
               i := Length(list);
               SetLength(list, Succ(i));
               list[i]:=StartDir + SearchRec.Name; //добавляем файл в динамичский массив!
           end
         else
           if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')then
             begin //если папка, но не текущая и не та которая уровнем выше
               i := Length(list);
               SetLength(list, Succ(i));
               ScanDir(StartDir + SearchRec.Name + '\', Mask, list[i]); //ищем файлы в подкаталогах (или это сейчас не надо?)
             end;
         until FindNext(SearchRec) <> 0;
         FindClose(SearchRec); //очищаем структуру
     end;
end;
При компиляции выдает:
Цитата:
[DCC Error] Unit1.pas(45): E2008 Incompatible types
на строки
Код:
              SetLength(list, Succ(i));
В чем может быть проблема?
Читал docs.embarcadero.com, но так и не понял, что у меня в коде не совместимо.

p.s. сильно не пинайте. Сегодня я впервые использую динамические массивы!!!
Самое потрясающее достижение программного обеспечения состоит в том, что оно способно уничтожить стабильность и любые достижения аппаратного обеспечения.
(Henry Petroski)
hooko вне форума Ответить с цитированием
Старый 02.01.2015, 18:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
p.s. сильно не пинайте. Сегодня я впервые использую динамические массивы!!!
дело в том, что в Delphi для совместимости со старым Паскалем оставлены "открытые массивы" (open array) - это когда параметер процедуры/функции содержит описание массива без границ. Это появилось ДО появления динамических массивов.

Бороться с этим очень просто.
Опишите свой тип где-нибудь в секции глобальных переменных:
Код:
type TDynStringArray = array of string;
и измените описание процедуры на
Код:
procedure ScanDir(StartDir: string; Mask: string; list: TDynStringArray);
....
но вообще-то говоря, в Delphi есть прекрасный тип TStringList! Очень рекомендую пользоваться им вместо динамического массива!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.01.2015, 18:54   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
type TMyArray = array of string;

procedure ScanDir(StartDir: string; Mask: string; var list: TMyArray);
...
               ScanDir(StartDir + SearchRec.Name + '\', Mask, list); //ищем файлы в подкаталогах (или это сейчас не надо?)


var list: TMyArray;

  ScanDir('каталог','',list);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан массив строк текста, строка символов разделителей. Сформировать текст из строк, содержащих заданное слово. Отсортировать дестронг Помощь студентам 1 16.05.2014 08:48
Динамический массив, массив указателей alexalisa Паскаль, Turbo Pascal, PascalABC.NET 4 22.04.2011 21:33
Дан динамический массив строк, вывести все слова начинающиеся с большой буквы C++ builder Memphi[s] Помощь студентам 0 02.03.2011 16:34
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
двумерный динамический массив с запросом к пользователю о кол-ве строк и столбцов? vasyapupkin Общие вопросы C/C++ 2 22.11.2009 17:37