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

Вниз

странности блочной записи BlockWrite   Найти похожие ветки 

 
marconi ©   (2003-11-28 22:39) [0]

Это скорее не вопрос, а предостережение чтоб не ходили по тем же граблям. даже и не знаю в какой форум написать, наверно все таки потрепаться =)))))
Обнаружелась страность в поведение каманды BlockWrite. а именно при работе с динамическими массивами.
Расмотри пример.
Сначало обычного массива
var buff: array [1..1024] of byte;
f: file of byte;
i:integer;
Begin
AssignFile(f,"c:\temp\r.dat");
Reset(f);
for i:=Low(buff) to high(buff) do buff[i]:=255;
BlockWrite(f,buff,high(buff));
CloseFile(f)
end;

все отрабатывается на 100% без проблем...примерно такой пример можно найти в хелпе от делфи.
самое интересное начинается на динамике (например перезапишем файл):
var f: file of byte;
buf: array of byte;
fsz,i:integer;
begin
AssignFile(f,"c:\temp\r.dat");
Reset(f);
Seek(f,0);
fsz:=FileSize(f);
SetLength(buf,fsz);
for i:=Low(buf) to high(buf) do buf[i]:=255;
BlockWrite(f,buf,fsz);
CloseFile(f);
end;

вот тут-то и ждет большая розовая птица обламинго. Глянув в файл замечаем кучу мусора из памяти. После долгих исследований выяснилось что первые 4 байта в файле имеют смысл остальные просто мусор. В этих 4х байтах оказался адресс памяти где лежит массив. Тоесть исправив код таким образом:
BlockWrite(f,buf[low(buf)],fsz);
все заработало...тоесть указав первый элемент масива.
вот так то.
Что это? фича или баг?
использовалась Delphi 7 и мои кривые руки =)


 
Юрий Зотов ©   (2003-11-28 22:47) [1]

Кривые руки. При динамическом массиве Buff - это указатель (см. F1), а в BlockWrite написано var. Поэтом BlockWrite(f,buff...), пишет хранящееся в указателе значение (то есть, адрес массива) и еще сколько-то байт, идущих сразу после этого указателя (то есть, мусор). А BlockWrite(f, buff[0]...) пишет сам массив.


 
Marconi ©   (2003-11-28 22:50) [2]

данная возможность не исключена =) все равнобыло очень не ожиданно получить такое результат после статических массивов


 
Юрий Зотов ©   (2003-11-28 22:54) [3]

> Marconi © (28.11.03 22:50) [2]

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


 
Marconi ©   (2003-11-28 22:55) [4]

да я разбирался долго, может это и прописная истина но я думаю статейка на эту тему очень не помешала бы.


 
Юрий Зотов ©   (2003-11-28 22:59) [5]

Дык... напишите, кто ж мешает.

Хотя в хелпе насчет указателя сказано четко, а остальное... остальное из этого вытекает однозначно.


 
Anatoly Podgoretsky ©   (2003-11-28 23:19) [6]

Как всегда Дельфи виновата :-)


 
Marconi ©   (2003-11-28 23:38) [7]

да =) пора бы сделать такой язык который сам бы подстравивался под любую кривизну рук =))) но все равно в этоге либо акес виолейшен либо windows



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

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

Наверх




Память: 0.48 MB
Время: 0.013 c
1-75150
kta
2003-12-09 16:42
2003.12.23
Как можно реализовать плавное проявление изображения bmp?


1-75234
Clift
2003-12-10 19:32
2003.12.23
Paramstr()


14-75366
Шишкин Илья
2003-11-28 18:18
2003.12.23
Биты информации


7-75415
Ivolg
2003-10-17 11:50
2003.12.23
Запуск на старте Windows


1-75222
ASt
2003-12-10 23:38
2003.12.23
проблема с FindComponent