IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> проблемы работы с директориями
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


Есть много вопросов по работе в BP7, TMT (3.90), FPC (2.4.0.i386-win32) под WinXP:
1) верно ли, процедуры FindFirst и FindNext могут одновременно работать с несколькими директориями и даже с одной директорией через несколько указателей;
2) верно ли, что указатель поиска в директории определяется только записью файла SR (тип TSearchRec), но не директорией в которой она расположена, т.е. только по записи файла SR возможно непосредственно определить ее директорию и ее расположение в директории;
3) верно ли, что вызов FindNext(SR) возвращает в SR следующую запись (если она есть, если нет - SR неопределено или исходное значение?) в директории ее (исходной записи SR) расположения, а не в директории из последнего вызова процедуры FindFirst;
4) верно ли, что вызов FindClose(SR) прекращает поиск (работу с указателем) в директории расположения записи, а не в директории из последнего вызова процедуры FindFirst, поиск в других директориях не прекращается (непонятно, зачем вообще нужна эта процедура, если вся работа идет с данными из записи SR);
- без выполнения данных взаимосвязанных утверждений рекурсивный поиск в директориях НЕВОЗМОЖЕН (по крайней мере, без создания списков их содержимого),

далее:
5) верно ли, что путь к директории в вызове процедуры FindFirst должен заканчиваться разделителем '\';
6) возможна ли проверка существования файла, директории или лог. диска по его имени/полному_имени без использования процедур FindFirst и FindNext;
7) возможна ли работа с текущей директорией (получение абс. пути, изменение);
8) верно ли, что имена директорий SR.name в их записях SR из их наддиректорий не содержат разделителя '\';
9) верно ли, что записи в любой не изменившейся директории при каждой ее обработке процедурами FindFirst и FindNext выдаются в одном и том же порядке (лексикографическом по именам?);
10) как обеспечить работу с длинными именами файлов (как вызвать Win под FPC);
11) верно ли, что поле Time в TSearchRec - это время создания файла (если нет, как узнать/изменить время создания), или это время его последнего изменения/открытия;
12) что представляют собой неизвестные компилятору типы полей записи SR файла в директории под Win: TFileName (=string ?), THandle, TWin32FindData, каким характеристикам файла они и Fill (тип array[1..21] of Byte) отвечают;
Win32 target
type
TSearchRec = record
Fill : array[1..21] of Byte;
Attr : Byte;
Time : Longint;
Size : Longint;
Name : TFileName;
ExcludeAttr : Longint;
FindHandle : THandle;
FindData : TWin32FindData
end;


--------------------
взять бы всех программистов - да утопить
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
Может, всё-таки процессор? Инструкция call какбы.
Ну да, процессор, ОС, все что угодно. Компилятор умеет условия для работы создавать...

Цитата
Паскалевский стиль мне ведом - структурность, описания в заголовках и т.д.
Значит, плохо ведом. Паскаль не разрешает (за исключением Extended Pascal, реализуемого компилятором GPC) конструировать функциональный тип в заголовке процедуры. Сначала опиши тип-функцию, потом (в заголовке) - подставляй идентификатор этого типа.

Цитата
Стиль Паскаля - аварийный вылет при ошибке!
Обработка ошибок, операторы, возвращающие значения и коды ошибок - это СИшная ересь!
Это ты говоришь, что тебе ведом Паскалевский стиль? Если тебе так хочется думать - это твои проблемы. Вообще-то IOResult/DOSError + директива {$I} для отключения моментального вылета, как раз для того, чтобы можно было обработать ошибку - это все есть в паскале, начиная с 3-ей версии. На более старых просто не работал, возможно оно и там есть... Мало того, тебе даже предоставляются возможности (опять же, начиная как минимум с версии 5.5) искусственно создать ошибку, чтобы проверить, как твой код умеет её обрабатывать... А ты говоришь - вылет. Вылет программы в некоторых местах равносилен вылету с работы, причем еще и с занесением в черный список. Будешь потом улицы мести, если возьмут...

Цитата
Хм, стек имеет тенденцию переполняться
Хм. Ты работаешь на WinXP? Тебе не хватит допустимой вложенности папок (да, да, и у NTFS тоже есть ограничения), чтобы переполнить стек, в особенности, если пользуешься современным компилятором, таким, как FPC. В котором, кстати, размер стека можно и увеличить, если что...

Цитата
в классическом Паскале вообще нет работы с внешними файлами
А в Паскале ее и не должно быть. Должно быть обращение к функциям ОС для того, чтобы на этой ОС уже работать с ее функциями (насчет бестолковости или толковости - это ты сначала на свой код посмотри, а потом будешь WinAPI обсуждать). Если Турбо-Паскаль был написан в то время, когда кроме DOS ничего не было (а если и было - то TP там не запускался), то ничего кроме Uses DOS в языке и быть не должно. То, что ты запускаешь TP под Windows - это ни разу не проблема Паскаля. Это проблема твоя. Есть компиляторы под Windows - пользуйся ими, там прекрасно реализована работа с WinAPI. Или вообще кроссплатформенные версии - но за это будешь платить размером исполняемых файлов, в частности. Не веришь? Запусти Лазарус и откомпилируй приложение, показывающее форму с одной кнопкой. 12Мб EXE-шник тебе обеспечен. Дельфи (упс, это же только Windows, может поэтому размер EXE-шника меньше? Не надо заботиться о том, как этот же код должен компилироваться в другой ОС, не надо делать обертки разные?) тебе в таком случае уложится в 200К, а на чистом API можно и в 30К уложиться (но это еще ближе к ОСи, замечаешь?). Ты все еще хочешь универсальности, чтоб можно было из любой ОСи работать с функциями ОС однотипно?

Цитата
а вот в компиляторах полно ограничений, начиная с отсутствия отладчика
Вообще-то и отладчик и IDE идет в стандартной установке FPC, которая качается с официального сайта. Я уж не знаю, чего ты там качал, что у тебя отладчика не оказалось.

Цитата
Ну почему нельзя было сделать расово верный идейно правильный набор примитивов работы с файловой системой - через типизированные указатели для файлов и каталогов, а работу с Dos и Win скрыть от программиста!
И чем тебе FPC-шный FindFirst (из модуля SysUtils) - не расово верный? Работает и под ДОС, и под Windows, да и Unix-ы тоже не забывает. Я ж не виноват, что кое-кто не умеет читать доки, правда?

Цитата
Как работать с длинными именами файлов, с временем создания файла, полными путями к файлам длинее 255 символов?
Пользоваться современными компиляторами, в них нет этого ограничения. Либо сторонними модулями (типа LDos) для старых компиляторов.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 6
Пол: Мужской

Репутация: -  0  +


Цитата
> Хм, стек имеет тенденцию переполняться

И сколько вложенных папок надо для того, чтобы он переполнился?
В общем случае. Рекурсия не только для вложенных папок.

Цитата
> Стиль Паскаля - аварийный вылет при ошибке!
Обработка ошибок, операторы, возвращающие значения и коды ошибок - это СИшная ересь!

Чем отличается Паскаль (турбо, который без исключений) от чистого Си (без исключений) в плане обработки ошибок?
Турбо Паскаль не вполне Паскаль. Паскаль предупреждает ошибки, а не обрабатывает.
Иначе, зачем Eof если есть IOResult ?

Цитата
> а вот в компиляторах полно ограничений, начиная с отсутствия отладчика

ЛОЛШТО
Отладчик это компенсация плохого хелпа. Не кристально ясный, неполный, не родного языка хелп - это не хелп. Интерфейс без хелпа (кроме интуитивно ясного примитива) - не интерфейс. Софт без интерфейса - неработающий софт.

Цитата
> полными путями к файлам длинее 255 символов?

А что, в ДОСе такие бывают?
А под винду пиши на дельфи, там строки длинные.
Что толку в длинных строках, сомневаюсь что сами файловые процедуры Assign, FindFirst с ними работают.
Не знаю как с этим в Дельфи, но это еще более громоздкая, более сложная для изучения вещь, чем BP и FPC.

Цитата
Значит, плохо ведом. Паскаль не разрешает (за исключением Extended Pascal, реализуемого компилятором GPC) конструировать функциональный тип в заголовке процедуры. Сначала опиши тип-функцию, потом (в заголовке) - подставляй идентификатор этого типа.
У Йенсена Вирта "ПАСКАЛЬ. Руководство пользователя" 1989 - ничего такого не сказано. Полных описаний языка еще нигде не видел. Паскалей много всяких версий, у каждой свои детали.

Цитата
Это ты говоришь, что тебе ведом Паскалевский стиль? Если тебе так хочется думать - это твои проблемы. Вообще-то IOResult/DOSError + директива {$I} для отключения моментального вылета, как раз для того, чтобы можно было обработать ошибку - это все есть в паскале, начиная с 3-ей версии. На более старых просто не работал, возможно оно и там есть... Мало того, тебе даже предоставляются возможности (опять же, начиная как минимум с версии 5.5) искусственно создать ошибку, чтобы проверить, как твой код умеет её обрабатывать...
Конечно все это есть. Там и бестиповые указатели есть. Но это не классический ISO Pascal Standart.

Цитата
А ты говоришь - вылет. Вылет программы в некоторых местах равносилен вылету с работы, причем еще и с занесением в черный список. Будешь потом улицы мести, если возьмут...
Я программирую только для себя, в свободное время, ничего такого мне не грозит. Я только любитель.

Это всего лишь вопрос стиля. Не нужен вылет, упреждай ошибку проверками.
Некорректную программу обработка ошибок от вылета все равно не спасет, придется ее перезапускать. Некорректная программа может просто выдать ошибочный результат, который в тех же "некоторых местах" не менее опасен чем вылет. Вопрос надежности ПО.
Система не должна вылетать при вылете программы, она не работает в исполняемой среде программы. Для аппаратных ошибок (которые всегда постфактум) вопрос стиля это вообще чистый синтаксис: процедура не возвращает особое значение, а устанавливает флаг ошибки через параметр-переменную. Обработка аппаратных ошибок это всегда низкоуровневое (системное) средство, да и не все их можно обработать.
А система должна предоставлять программе высокого уровня ресурсы с детерминированным поведением: захватил ресурс, проверил его наличие - он должен безотказно работать, безо всяких перепроверок. Отказы нарушающие это правило должны приводить к вылету всякой высокоуровневой программы, если система их заметит (иначе она сама "рухнула" - не справилась со своими обязанностями).
Паскаль это стиль высокоуровневых программ.

Если же значения параметров или поступающих внешних данных некорректны, тогда неважно вылет или обработка, результат бессмысленен - выход за спецификацию.
Ну, если очень нужно, сделай программную проверку корректности внешних данных, при неизбежности ошибки: скорректируй их, если в откорректированных данных вообще есть смысл, или внепланово выйди из процедуры, установив через параметр-переменную флаг ошибки - пусть внешняя программа решает что делать.

Цитата
Хм. Ты работаешь на WinXP? Тебе не хватит допустимой вложенности папок (да, да, и у NTFS тоже есть ограничения), чтобы переполнить стек, в особенности, если пользуешься современным компилятором, таким, как FPC. В котором, кстати, размер стека можно и увеличить, если что...
С папками всякое может быть. Хочется иметь программу работающую в любых случаях, допустимых ОСью и ФС.
На моем компе стоит только FAT.

Цитата
А в Паскале ее и не должно быть. Должно быть обращение к функциям ОС для того, чтобы на этой ОС уже работать с ее функциями (насчет бестолковости или толковости - это ты сначала на свой код посмотри, а потом будешь WinAPI обсуждать). Если Турбо-Паскаль был написан в то время, когда кроме DOS ничего не было (а если и было - то TP там не запускался), то ничего кроме Uses DOS в языке и быть не должно. То, что ты запускаешь TP под Windows - это ни разу не проблема Паскаля. Это проблема твоя. Есть компиляторы под Windows - пользуйся ими, там прекрасно реализована работа с WinAPI. Или вообще кроссплатформенные версии - но за это будешь платить размером исполняемых файлов, в частности. Не веришь? Запусти Лазарус и откомпилируй приложение, показывающее форму с одной кнопкой. 12Мб EXE-шник тебе обеспечен. Дельфи (упс, это же только Windows, может поэтому размер EXE-шника меньше? Не надо заботиться о том, как этот же код должен компилироваться в другой ОС, не надо делать обертки разные?) тебе в таком случае уложится в 200К, а на чистом API можно и в 30К уложиться (но это еще ближе к ОСи, замечаешь?). Ты все еще хочешь универсальности, чтоб можно было из любой ОСи работать с функциями ОС однотипно?
Объем при кроссплатформенности зависит по крайней мере от числа реализуемых ОС и их версий. А если втупую утрамбовать компоненты бинарного кода оптимального под каждую из них + небольшой загрузчик, определяющий тип-версию ОС и передающий управление. 12Мб/30К = 400 ОСей и версий - зачем так много?

Универсальность исходного кода вполне совместима с чистым API. Перевод исходника в чистый API это работа компилятора, а не программиста. Системные примитивы в свою очередь должны позволять безопасную реализацию любого универсального кода без серьезной потери производительности по сравнению с эквивалентным машинным кодом или кодом на другой API. Иначе это никудышные примитивы.
С различными ФС в полной мере универсально работать нельзя, это разные типы данных.

Я API не изучал, да и не планирую. И программы с окнами не делал, не умею, и не собираюсь изучать. Это для меня запредельные материи. Освоить нереально.
Мне бы полноценную работу с ФС освоить, больше мне не надо. Задание (параметры) пишется в файл либо исходник, программа запускается, файлы читает, обрабатывает, создает, удаляет, и завершается, все результаты - файлах. Так я работаю. Примитивно, но доступно. Без поиска и перевода документации годами, жизнь то не резиновая.

Цитата
Вообще-то и отладчик и IDE идет в стандартной установке FPC, которая качается с официального сайта. Я уж не знаю, чего ты там качал, что у тебя отладчика не оказалось.
Я посмотрел, действительно есть, извиняюсь, не заметил. Но он такой же неадекватный как в BP7. И редактор (то есть IDE) такой же допотопный как BP7. Я поэтому редактирую в TMT, куда удобнее, там у меня получалось скомпилировать все написанные программки, кроме обсуждаемой здесь.

Цитата
И чем тебе FPC-шный FindFirst (из модуля SysUtils) - не расово верный? Работает и под ДОС, и под Windows, да и Unix-ы тоже не забывает. Я ж не виноват, что кое-кто не умеет читать доки, правда?
Доки пишутся невнятно. У меня были большие сомнения.
Что до идеологии: нет единообразия работы с каталогами и файлами. Чтобы отдельно дескриптор каталога с указателем, и отдельно буферная переменная со значением = запись файла в каталоге (имя, индекс или первый сектор). Каталоги не открываются, не закрываются, не захватываются (на запись/чтение) по сегментам имен файлов. Потом, через этот SearchRec нельзя сразу привязать дескриптор на файл. То есть файл я уже нашел, но получил только его имя, и теперь, получив путь к файлу, системе приходится заново проводить поиск, да еще начиная от корневого либо текущего во всех промежуточных каталогах, чтобы привязать дескриптор - крайне затратная операция (а как быть в Unix-е, где в одном каталоге несколько файлов могут иметь одно имя? хотя бы индекс файла нужно заполучить из SearchRec). То же самое из-за невозможности скопировать дескриптор. Вот это и есть бестолковая система примитивов.

Цитата
Пользоваться современными компиляторами, в них нет этого ограничения. Либо сторонними модулями (типа LDos) для старых компиляторов.
Что-то там подозрительно Windows 95 упоминается. А в какую папку распаковать, чтоб заработало?

Вот моя программа реализованная через рекурсию, компилироваться разумеется не будет.
Меньше не стала, появился дублирующий код. Кое-что исправлено.
Тело селективной функции упрощено до return(true). Закомментирована под завязку, чтобы никто голову не напрягал.
Код
{$I+, Q+, R+, S+}
program
  fullcopydir(
    dir1, dir2 : string; (* исходные директории, содержимое всех уровней вложенности которых, соответственно, селективно копируется и становится результатом селективного копирования *)
    prov : boolean (* необходимость проверки исходной директории dir1 и ее копии dir2 на вложенность *)
  );
const
  maxh = 127; (* предел глубины расположения файлов *)
  l = min(length(dir1), length(dir2)); (* вспомогательная константа, минимум длины абсолютного пути *)
var
  i : byte; (* вспомогательная переменная, номер символа абсолютного пути *)
  attr : word; (* атрибуты исходной директории dir1 *)
  time : longint; (* время ? исходной директории dir1 *)
  f, d : file; (* вспомогательные дескрипторы, соответственно, исходной директории dir1 и ее копии *)
  function
    sel(
      attr : byte; (* атрибуты проверяемого файла *)
      time : longint; (* время ? проверяемого файла *)
      size : longint; (* размер проверяемого файла *)
      name : string (* имя проверяемого файла *)
    ) : boolean; (* функция селекции на копирование проверяемого файла по некоторым полям его паспорта *)
  begin
    return(true)
  end;
  procedure
    copydir(
      h : [0..maxh]; (* глубина директории текущей dir1 и содержимых ею файлов *)
      b0 : boolean; (* выполнение текущей директорией dir1 условия селекции, т.е. ее затребованность для копирования *)
      ln : byte; (* максимальная длина абсолютного пути к содержимому текущей директории dir1 и к ее копии *)
      dir1, dir2 : string (* текущие директории, содержимое всех уровней вложенности которых, соответственно, селективно копируется и становится результатом селективного копирования *)
    );
  var
    e : boolean; (* условие успешного завершения текущего шага поиска *)
    i : byte; (* буферная переменная для копируемого байта *)
    f, g : file; (* вспомогательные дескрипторы, соответственно, копируемых и являющихся копиями файлов *)
    b : boolean; (* текущее значение условия сохранения копии директории dir1 *)
    sr : tsearchrec; (* паспорт найденных файлов и дескриптор поиска *)
  begin
    b := b0; (* начальное значение условия сохранения копии директории dir1 *)
    e := findfirst(dir1+'*', anyfile, sr)=0; (* поиск первого файла директории dir1, условие его нахождения *)
    while e do (* первый либо следующий файл директории dir1 найден *)
      if (sr.attr and directory)=directory then (* найденный файл - директория *)
        if (sr.name='.') or (sr.name='..') then (* найденный файл - специальная поддиректория, игнорируется *)
          e := findnext(sr)=0 (* поиск следующего файла директории dir1, условие его нахождения *)
        else (* найденный файл - обычная поддиректория *)
          begin (* копирование найденной поддиректории *)
            createdir(dir2+sr.name+'\'); (* создание пустой копии найденной поддиректории *)
            assign(g, dir2+sr.name+'\'); (* дескриптор копии найденной поддиректории *)
            setfattr(g, sr.attr); (* копирование атрибутов найденной поддиректории *)
            setftime(g, sr.time); (* копирование времени ? найденной поддиректории *)
            copydir(
              h+1, (* глубина найденной поддиректории и содержимых ею файлов *)
              sel(sr.attr, sr.time, sr.size, sr.name), (* выполнение условия селекции найденной поддиректорией, т.е. ее затребованность для копирования *)
              ln+length(sr.name)+1, (* максимум длины абсолютного пути к содержимому найденной поддиректории и ее копии *)
              dir1+sr.name+'\', (* найденная поддиректория *)
              dir2+sr.name+'\' (* копия найденной поддиректории *)
            ); (* селективное копирование содержимого всех уровней вложенности найденной поддиректории; удаление копии найденной поддиректории, если она пустая и не требуется *)
            e := findnext(sr)=0 (* поиск следующего файла директории dir1, условие его нахождения *)
          end
      else (* найденный файл - не директория *)
        begin
          if sel(sr.attr, sr.time, sr.size, sr.name) then (* найденный файл выполняет условию селекции, т.е. затребован для копирования *)
            begin  (* копирование найденного файла *)
              b := true; (* условие сохранения копии директории dir1 выполнено *)
              assign(f, dir1+sr.name); (* дескриптор найденного файла *)
              assign(g, dir2+sr.name); (* дескриптор копии найденного файла *)
              reset(f, 1); (* открытие найденного файла для побайтного чтения *)
              rewrite(g, 1); (* пересоздание и открытие копии найденного файла для побайтной записи *)
              (* копирование содержимого найденного файла *)
              while not eof(f) do (* конец найденного файла не достигнут *)
                begin
                  read(f, i); (* чтение текущего байта найденного файла *)
                  write(g, i) (* копирование текущего байта найденного файла *)
                end;
              close(f); (* закрытие найденного файла *)
              close(g); (* закрытие копии найденного файла *)
              setfattr(g, sr.attr) (* копирование атрибутов найденного файла *)
              setftime(g, sr.time); (* копирование времени ? найденного файла *)
            end;
          e := findnext(sr)=0 (* поиск следующего файла директории dir1, условие его нахождения *)
        end;
    (* первый либо следующий файл директории dir1 не найден *)
    findclose(sr); (* высвобождаем ресурсы поиска в директории dir1 *)
    (* проверка конечного условия сохранения копии директории dir1 = затребованность для копирования самой dir1 или некоторых содержимых ею файлов *)
    if not b then (* в директории dir2 нет скопированных файлов и сама она не требуется *)
      begin
        assign(g, dir2); (* дескриптор директории dir2 *)
        setfattr(g, $00); (* снятие флага 'только для чтения' с директории dir2 *)
        erase(g) (* удаление пустой директории dir2 *)
      end
  end;
begin
  if prov then (* необходима проверка исходной директории dir1 и ее копии *)
    begin
      (* проверка исходных директорий на вложенность *)
      i := 1;
      while i<=l and dir1[i]=dir2[i] do
        i := i+1;
      if i>l then (* исходные директории вложены *)
        halt (* аварийная остановка программы *)
    end;
  assign(f, dir1); (* дескриптор исходной директории dir1 *)
  getfattr(f, attr); (* чтение атрибутов исходной директории dir1 *)
  getftime(g, time); (* чтение времени ? исходной директории dir1 *)
  createdir(dir2); (* создание пустой копии исходной директории dir1 - директории dir2 *)
  assign(g, dir2); (* дескриптор директории dir2 *)
  setfattr(g, attr); (* копирование атрибутов исходной директории dir1 *)
  setftime(g, time); (* копирование времени ? исходной директории dir1 *)
  copydir(
    0, (* глубина исходной директории dir1 и содержимых ею файлов *)
    true, (* исходная директория dir1 требуется для копирования *)
    max(length(dir1),length(dir2)),
    dir1, (* исходная директория dir1 *)
    dir2 (* копия исходной директории dir1 *)
  ) (* селективное копирование содержимого всех уровней вложенности исходной директории dir1 *)
end.
Переменные h и ln можно выбросить, они задумывались для контроля, но так и не использованы.
CreateDir создает каталог, а если он уже существует, вызывает ошибку. А ReWrite затирает существующий файл, что несимметрично. Нельзя однако без обработки ошибок создать файл, вызывая ошибку если он уже существует.
Программа во время работы не только создает, но и удаляет ненужные каталоги. При рекурсии это исправить затруднительно.

Компиляция на FPC выдает ту же ошибку в четвертой строке:
dir1, dir2 : string;
пишет:
dir1.pas(4,16) Fatal: Syntax Error, ")" expected but ":" fond
dir1.pas(0) Fatal: Compilation aborted
запись параметров в одну строку не помогает.
Вот что ему не нравится? типизация через двоеточие? причем здесь закрывающая скобка?
Похоже отладчик не однопроходный, ошибки ищет не последовательно.
Я должен по всему документу рыскать, где там синтаксис нарушен? - в ж... такой отладчик!


--------------------
взять бы всех программистов - да утопить
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
ddn   проблемы работы с директориями   13.07.2010 13:12
volvo   Ты для начала переведи то, что написано выше на но…   13.07.2010 13:46
ddn   (Dir1<>Dir2) FindFirst(Dir1+mask1, Attr1, SR…   13.07.2010 16:58
TarasBer   > (* Dir1 - директория расположения записи SR1 …   13.07.2010 18:59
ddn   > (* Dir1 - директория расположения записи SR1 …   13.07.2010 22:11
volvo   Если не работает - значит не должна. То, что должн…   13.07.2010 22:57
ddn   Я уже озвучил: селективное копирование файлов (в т…   14.07.2010 1:20
TarasBer   Ну может ручная развёртка хвостовой рекурсии и при…   14.07.2010 14:28
volvo   Ну да, процессор, ОС, все что угодно. Компилятор у…   14.07.2010 15:14
ddn   В общем случае. Рекурсия не только для вложенных п…   15.07.2010 14:02
Client   program fullcopydir( ...а указать имя программы?   15.07.2010 14:25
volvo   Если ты пишешь так, что у тебя получается результи…   15.07.2010 14:58
TarasBer   > В общем случае. Рекурсия не только для вложен…   15.07.2010 15:21
TarasBer   {$I+, Q+, R+, S+} program fullcopydir…   15.07.2010 15:59
Гость   а указать имя программы? fullcopydir и есть ее имя…   15.07.2010 17:31
volvo   В общем, так, ddn... [code=pas]{$mode delph…   15.07.2010 16:43
TarasBer   До меня дошло. program fullcopydir( dir1,…   15.07.2010 17:20
volvo   В таком случае ЭТО - не Паскаль. По крайней мере, …   15.07.2010 17:36
TarasBer   > На Дельфи пока рано переходить, весит больше,…   15.07.2010 17:38
ddn   Вот блин, под гостем оставил. Там нужно исправить …   16.07.2010 0:15
TarasBer   > Зачем SizeOf(Buf) вычисляется каждый раз, раз…   16.07.2010 13:12
volvo   Как угодно можно. Количество блоков Var/Type/Const…   16.07.2010 14:08


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 3.05.2024 11:53
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name