В Turbo/Borland PAscal обязателен. Это в C этот параметр у аналогичной функции отсутствует.Esgal писал(а):BBB, я тоже думал об этом...
А есть ли вообще способ, адресовать 100 000 строк в Паскале?Списком, как уже упомянул Naeel Maqsudov.Разве freemem второй параметр не обязателен?
Освобождение выделанной памяти
Во-первых, сильно сомневаюсь, что средний размер строки будет порядка 5 символов. Как бы мы не выделяли память, то общий адресуемый свободный кусок будет не более 500К, т.е. за вычетом резидентов, системных таблиц и пр. Как ни крути, но придется задействовать XMS или EMS драйвер для доступа к расширеной памяти, и осуществлять доступ к нужной строке через функцию, которая будет сама управлять подкачкой новых блоков и правкой индексов, как сказал Naeel Maqsudov.
Во-вторых, выделить память заранее для N строк, как было предложено не получится хотя бы потому, что строки имеют разную длину.
И даже создать единую таблицу поинтеров на них будет нерационально, в 64К они явно не поместятся. Однако имеет смысл хранить таблицу вида
[номер_блока_XMS]
[колво_строк_в_блоке]
А в самом блоке локальную таблицу смещений для каждой строки. Это позволит значительно ускорить обращение к нужной строке по сравнению со связаным списком, если конечно не считать времени для подкачки нужного блока из памяти (однако в связаном списке таких подкачек будет еще больше при обращении к строкам, индекс которых далеко от 0). Разумеется должна быть проверка есть ли такой блок уже подкаченный или нет.
Такая таблица кстати может кому то напомнить аппаратную связь GDT/LDT
Во-вторых, выделить память заранее для N строк, как было предложено не получится хотя бы потому, что строки имеют разную длину.
И даже создать единую таблицу поинтеров на них будет нерационально, в 64К они явно не поместятся. Однако имеет смысл хранить таблицу вида
[номер_блока_XMS]
[колво_строк_в_блоке]
А в самом блоке локальную таблицу смещений для каждой строки. Это позволит значительно ускорить обращение к нужной строке по сравнению со связаным списком, если конечно не считать времени для подкачки нужного блока из памяти (однако в связаном списке таких подкачек будет еще больше при обращении к строкам, индекс которых далеко от 0). Разумеется должна быть проверка есть ли такой блок уже подкаченный или нет.
Такая таблица кстати может кому то напомнить аппаратную связь GDT/LDT
It's a long way to the top if you wanna rock'n'roll
-
- Сообщения: 22
- Зарегистрирован: 24 мар 2009, 13:25
- Откуда: St.Petersburg
А действительно ли нужно считывать в RAM весь файл?
Если без этого никак -
- определите размер файла;
- выделите блок памяти этого размера;
- считайте его в RAM и обработайте как массив байтов.
Если без этого никак -
- определите размер файла;
- выделите блок памяти этого размера;
- считайте его в RAM и обработайте как массив байтов.