|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
27.03.2009, 02:13 | #1 |
Форумчанин
Регистрация: 08.01.2008
Сообщений: 233
|
Как использовать команды FileRead, FileOpen
Есть динамический массив. И есть фукция которая читает в него данные из файла.
var Data: array of byte; iSize: integer; ... SetLength(Data,iSize); ... FileRead(iFileHandle, Data, iSize); Получается, в целом, фигня (сыпяться волюм аксешены). Подозреваю что это из-за того что массив динамический (на самом деле там указатель на структуру, одно из полей которой динамический массив), т.е. при изменени размера он "прерывается" и не идет сплошников в памяти. Так ли это? Можно как-нить сделать так что бы не читать из файла побайтно и копировать в массив? Может можно как-нить создать другой массив, уже после того как размер нужный известен? Еще заметил, что при больших размерах буфера (больше 100килобайт), FileRead возвращает -1, что это значит я так и не понял. Подозреваю что из-за ограничения какого-то внутреннего буфера чтения... можно это как-нить обойти? В хелпе прочел рекомендацию юзать BlockRead для дельфей, но почему так и не понял. Мне FileRead нужен из-за того что позволяет позиционироваться в файле. И еще в догонку... Как создать файл командой FileOpen? В документации сказано что нужен параметр fmCreate, типа создастся и все нормально будет, но в реальности файл не создаеться, вместо хендла озвпращается -1 и хз из-за чего. |
27.03.2009, 09:21 | #2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
крайне рекомендую разобраться с TFileStream
там есть всё, что Вам нужно. (и даже чуть больше а по поводу чтения в динамический массив - так НЕ ЧИТАЙТЕ в динамический! На крайний случай: Код:
Меняйте алгоритм обработки данных! |
27.03.2009, 09:32 | #3 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Эмм.. зачем же... вот
Код:
Код:
|
27.03.2009, 09:57 | #4 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Код:
Это я просмотрел... p.s. хотя я всё равно уверен, что динамические массивы — это зло, потеря производительности и потенциальная возможность всяких глюков... хотя... если алгоритм этого требует... |
|
31.03.2009, 00:35 | #5 |
Форумчанин
Регистрация: 08.01.2008
Сообщений: 233
|
Так это... сами то динамические масивы отличаются в работе от статических? Попрбовал сегодня посоздавать их и пробежаться по адресам элементов - вроде все подряд идут. Или это просто "так склалось", а вообще не факт?
Про скорость знаю, но она тут не главное. А как еще делать, когда неизвестен объем данных, которые предстоит "набрать" в массив? |
31.03.2009, 01:43 | #6 | |
Форумчанин
Регистрация: 12.05.2007
Сообщений: 373
|
Динамические массивы отличаються тем что их размер можна изменить в любое время (что более удобно с точчки зрения высвобождения ресурсов)..
и еще их отличие в том что они занимають последние байты в оперативной памяти программы, в то время как статический массив может быть в любом месте.. Цитата:
узнаешь требуемое место, выделяешь память, помещаешь туда данные.. копируешь от туда данные, чистишь за собою..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен: "Перемен!Мы ждем перемен!" |
|
31.03.2009, 01:51 | #7 | |||
Форумчанин
Регистрация: 08.01.2008
Сообщений: 233
|
Цитата:
Цитата:
Цитата:
|
|||
31.03.2009, 02:49 | #8 | |||
Форумчанин
Регистрация: 12.05.2007
Сообщений: 373
|
Цитата:
Цитата:
если бы динамический массив бил в середине программы или в начале то или бы он имел какието ограничения, или же портил данные программы (заголовки форм, надписи элементов и т.д.)
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен: "Перемен!Мы ждем перемен!" |
|||
31.03.2009, 04:33 | #9 | |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
Если одномерный, то разницы со статическим нет никакой, а вот если многомерный, то понятие непрерывности применимо только к одному "измерению". Например, статический двумерный массив array[1..100, 1..100] of Integer будет целиком размещаться непрерывно и занимать 100х100х4=40000 байт (или 80000, в зависимости от параметров выравнивания) - по нему можно "ходить вручную" с помощью указателя. А вот динамический array of array of Integer не обязательно ляжет сплошным куском, это будет зависеть от того, как он создается, ведь такой массив не обязательно должен быть "прямоугольным". В любом случае непрерывно разместиться только первый "ряд" - его элементы будут содержать указатели на массивы "второго измерения", а уж где они разместятся...
В общем, можно пройтись по "первому измерению", можно - по "второму" (отдельно по каждой строке), но невозможно пройти от начала до конца, как при статическом массиве. Цитата:
|
|
31.03.2009, 13:52 | #10 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Боже мой... ребят, о чем вы ? Навыдумавали черт знает что
Вот вам динамический массив Код:
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как использовать скины | SeRhy | Компоненты Delphi | 10 | 06.11.2010 00:23 |
как использовать указатель this | z3rg | Общие вопросы C/C++ | 2 | 16.03.2009 23:28 |
Как сохранить файл чтобы пропали все команды, | Rashanea | Microsoft Office Excel | 2 | 27.11.2008 22:43 |
Как использовать png | Sanek777 | Общие вопросы Delphi | 1 | 25.09.2008 20:14 |