Главная страница
    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.007 c
3-75112
ksan
2003-11-28 19:33
2003.12.23
просмотр RDB$ таблиц


1-75239
ertong
2003-12-10 18:11
2003.12.23
Проблемы с try


3-75098
Alexey V.
2003-11-29 15:31
2003.12.23
BDE или ADO...


3-75127
r900
2003-11-28 11:16
2003.12.23
Запись в поле таблицы?


3-75084
Frog
2003-11-30 18:56
2003.12.23
Помогите плз с прогоном SQL скриптов !!!!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский