Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.19;
Скачать: CL | DM;

Вниз

Проблема с динамическим массивом   Найти похожие ветки 

 
DeScriptor ©   (2003-06-05 21:39) [0]

Я совсем еще зеленый программсит, ничего, почти, не умею, поэтому решил прибегнуть к помощи знающих людей. Проблема следующая: У меня есть динамический массив, в который я собираюсь читать блок из файла процедурой BlockRead; после прочтения первого блока, размер массива неопределим, файл не закрывается, содержимое массива - пусто! Если я делаю все то же самое, но в статический массив, все работает. Почему так?
Вот кусочек кода, в котором производятся вышеописанные действия:

type FormatSett = record
ContentType,TableSizeFormat:string;
HeaderLen,TableField:integer;
end;

var
MainWin: TMainWin;
BigFormat:FormatSett;

procedure ExtractLoop();

implementation

{$R *.dfm}

procedure ExtractLoop();
var
SourceFile,DestFile:file;
ReadBuff: array of byte;
i:integer;
begin
with MainWin do begin
AssignFile(SourceFile,OpenSrc.FileName);
reset(SourceFile,1);
SetLength(ReadBuff,BigFormat.HeaderLen);
BlockRead(SourceFile,ReadBuff,BigFormat.HeaderLen);
closefile(SourceFile);
end;
end;


 
VMcL ©   (2003-06-05 21:46) [1]

BlockRead(SourceFile,Pointer(ReadBuff)^,BigFormat.HeaderLen);


 
Forester ©   (2003-06-05 21:54) [2]

Pointer(ReadBuff)^ в ответе выше можно заменить на ReadBuff[0]
(те же яйца - вид сбоку ;) )


 
DeScriptor ©   (2003-06-06 07:11) [3]

Всем огромное спасибо!!! Сработало! =) Есть, правда у меня подвопрос: а почему оно так работает? Что означает Pointer(ReadBuff)^, он же ReadBuff[0]? Заранее еще одно спасибо! =))


 
MBo ©   (2003-06-06 07:16) [4]

в процедуре Buffer описан как var - это означает, что компилятор берет адрес использованной переменной, и рассматривает его как адрес начала блока, куда надо писать. Просто ReadBuff - динамичесий массив - суть указатель, и в твоем исходном варианте используется адрес переменной - этого указателя, а не то, куда он указывает.


 
DeScriptor ©   (2003-06-06 17:52) [5]

Понятно, я так и подозревал! Еще раз огромное спасибо! А то я с этими указателями немного не разобрался: по моим представлениям они указывают на адрес переменной в памяти, но, глядя на множество примеров я теряюсь: указатели используются везде...



Страницы: 1 вся ветка

Текущий архив: 2003.06.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
3-60016
Vick
2003-05-27 12:36
2003.06.19
Идентификация пользователя в базе MSSQL


1-60227
shal
2003-06-05 16:08
2003.06.19
скалярное произведение, метод Гаусса...


1-60223
Rel_
2003-06-05 15:46
2003.06.19
работа с памятью


1-60205
Erik
2003-06-05 10:43
2003.06.19
Опрос свех инстанций com сервера.


1-60134
Merlot
2003-06-06 13:16
2003.06.19
количество дней между датами