Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
4-75459
John Smith
2003-10-22 11:05
2003.12.23
Стандартные иконки программ и документов


1-75159
R
2003-12-09 04:48
2003.12.23
Подсветка элементов текста


1-75263
Димон
2003-12-10 10:42
2003.12.23
Сортировка в ListView


1-75174
Barsky
2003-12-11 12:17
2003.12.23
Как узнать размер файла?


9-75069
X-RayMan
2003-06-01 20:03
2003.12.23
Перспектива...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский