Форум: "Начинающим";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Вниздинамические массивы в BlockRead Найти похожие ветки
← →
Grief © (2005-09-28 13:58) [0]При чтении из файла процедурой BlockRead нельзя в качестве буфера использовать динамический массив - I/O 998? несмотря на то, что он даже больше требуемой длины. Спрашивается, как же тогда читать информацию, переменного объема без цикла, он весьма прилично, как мне кажется снизит скорость работы, т.к. после чтения информации над ней происходят некоторые операции... Создать массив максимальной длины нежелательно - максимальный объем данных составляет 2 Гб.
← →
begin...end © (2005-09-28 13:59) [1]Приведите код чтения.
← →
Grief © (2005-09-28 14:03) [2]var
R, N: Integer
D: array of Byte;
...
N :={ ....чему-то там...}
SetLength(D, N);
BlockRead(DataFile, D, N, R);
← →
begin...end © (2005-09-28 14:05) [3]> Grief © (28.09.05 14:03) [2]
> BlockRead(DataFile, D, N, R);
BlockRead(DataFile, D[0], N, R);
← →
Grief © (2005-09-28 14:09) [4]вот к примеру, массив не заполняется инчем, а потом эсесс виолэйшн!
procedure TForm1.Button1Click(Sender: TObject);
var Data: file;
D: array of Byte;
R, N: Integer;
begin
AssignFile(Data, "C:\Fuck.dat");
Reset(Data, 1);
N := 3;
SetLength(D, N);
BlockRead(Data, D, N, R);
CloseFile(Data);
end;
Я надеюсь, ясно чего я хочу. Вопрос в том, как этого добиться...
← →
Grief © (2005-09-28 14:10) [5]Хм, спасибо конечно, я б сам не догадался, а почему именно так?
← →
begin...end © (2005-09-28 14:14) [6]> Grief © (28.09.05 14:10) [5]
Из справки:
procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);
BlockRead reads Count or fewer records from the file F into memory, starting at the first byte occupied by Buf.
Т.е. данные из файла будут читаться в память по адресу переменной Buf. В [4] в качестве Buf указана переменная динамического массива D. Она является указателем на тело массива, поэтому данные считываются не в тело массива, а в указатель на него -- отсюда и ошибка.
← →
palva © (2005-09-28 14:17) [7]Потому что динамический массив на самом деле указатель на некую структуру. Он занимает в памяти всегда 4 байта. А сами данные динамически размещаются в куче. Указав первый элемент данных вы фактически указали, с какого места начинать заполнение массива при чтении его из файла. Будут ли данные массива лежать непрерывным куском - тоже вопрос.
← →
begin...end © (2005-09-28 14:19) [8]> palva © (28.09.05 14:17) [7]
> Будут ли данные массива лежать непрерывным куском - тоже
> вопрос.
Не вопрос.
← →
palva © (2005-09-28 14:55) [9]begin...end © (28.09.05 14:19) [8]
> Не вопрос.
А что, где-то в документации дают гарантию?
← →
begin...end © (2005-09-28 15:18) [10]> palva © (28.09.05 14:55) [9]
А что, реализация дин. массивов засекречена?
← →
Grief © (2005-09-28 16:10) [11]Спасибо большое! Теперь-то ясно.
← →
palva © (2005-09-28 18:51) [12]begin...end © (28.09.05 15:18) [10]
> А что, реализация дин. массивов засекречена?
Так нечестно. Я первый спросил.
← →
begin...end © (2005-09-28 18:58) [13]> palva © (28.09.05 18:51) [12]
Ответ на вопрос [9]: точно не знаю, есть ли такая гарантия в документации или нет.
← →
begin...end © (2005-09-28 19:05) [14]> palva
Теперь, плз, ответьте на вопрос [10] и изложите основания Вашей точки зрения [7].
← →
palva © (2005-09-28 21:31) [15]Про реализацию. Нашел я в system.pas несколько процедур, среди них _DynArrayCopy. Если это и есть реализация динамических массивов, то получается, что она не засекречена.
Насчет [7]. Я читал в умных книжках про реализацию строк, где хранится длина, где счетчик ссылок. Но при этом говорилось, что использовать знание таких подробностей в рабочих проектах не рекомендуется. Т. е. сегодня так, а завтра может быть по-другому. Ну то есть, если в терминах ООП, то пользователю дается интерфейс, который разработчик обязуется не менять, а все остальное может измениться. Поэтому я и поинтересовался, есть ли где нибудь в литературе информация о том, что элементы дин. массива располагаются единым куском. То есть является ли эта договоренность частью "интерфейса".
Если бы я лично писал сишный класс, то я не исключаю, что я реализовал бы возможность хранить дин.массив несколькими кусками, при этом переопределил бы операцию []. Это сделало бы проще перераспределение памяти при увеличении размера. Т. е. дало бы выигрыш в производительности в тех случаях, когда массив часто меняет свой размер.
Никакой особенной точки зрения в [7] я пожалуй и не высказывал, лишь отметил, что для меня это вопрос открытый.
← →
Anatoly Podgoretsky © (2005-09-28 21:47) [16]palva © (28.09.05 21:31) [15]
И правильно, например эта недокументированя область раньше была 12 байт, а теперь 8
← →
begin...end © (2005-09-29 08:38) [17]> palva © (28.09.05 21:31) [15]
> Нашел я в system.pas несколько процедур, среди них _DynArrayCopy.
> Если это и есть реализация динамических массивов, то получается,
> что она не засекречена.
_DynArrayCopy -- это действительно часть реализации динамических массивов. И эта реализация действительно не засекречена.
> Никакой особенной точки зрения в [7] я пожалуй и не высказывал,
> лишь отметил, что для меня это вопрос открытый.
В [7] Вы высказали точку зрения -- сомнение в том, что данные массива располагаются в непрерывном блоке памяти. В [14] я попросил изложить основания для таких сомнений. И не услышал ничего, кроме того, что в следующих версиях может быть по-другому. При этом непонятно, причём здесь вообще следующие версии, ведь в заголовке темы указана D7.
Выделение памяти для динамического массива сводится к вызову GetMem. У меня нет оснований считать, что блок памяти, выделяемый GetMem, не будет непрерывным. Более того, я уверен, что он будет непрерывным (во всех версиях Delphi до D7 включительно). Начиная с Delphi 4 (где появились динамические массивы), выделение памяти для них осуществляется схожим образом, и во всех этих версиях данные массива будут лежать непрерывным блоком.
Конечно, нельзя полностью исключать, что Borland изменит реализацию динамических массивов или даже GetMem, но, если это произойдёт, то ему придётся поместить внушительную часть своего же кода в Recycle Bin.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c