Форум: "Потрепаться";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
Внизстранности блочной записи 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c