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

Вниз

Blockread и динамический массив   Найти похожие ветки 

 
Alek Silverstone ©   (2003-04-25 14:32) [0]

Здрасте всем! Есть следующий код:

reset(f,1);
size:=filesize(f);
closefile(f);
setlength(buf,size);
reset(f,size);
blockread(f,buf,1);
closefile(f);

Синтаксически вроде првильный. НО! после его выполнения массив buf не то что пустой, а имеет нулевую длину! :( Соответственно, любое обращение к нему влечёт EAccessViolation. В чём дело? Юзаю Delphi 6 Update Pack 2, возможности поставить семёрку нет - комп каменного века.


 
icWasya ©   (2003-04-25 14:35) [1]


reset(f,1);
size:=filesize(f);
closefile(f);
setlength(buf,size);
reset(f,size);
blockread(f,buf [0],1);
closefile(f);



 
Alek Silverstone ©   (2003-04-25 14:45) [2]

Ты на размер записи в reset посмотри, а потом пиши.


 
Alek Silverstone ©   (2003-04-25 15:07) [3]

Кстати, вариант

reset(f,1);
size:=filesize(f);
setlength(buf,size);
blockread(f,buf,size);
closefile(f);

возвращает точно такой же результат, т.е. нулевой массив. :(


 
MBo ©   (2003-04-25 15:31) [4]

Тебе дали абсолютно верный совет, подходяший как для случая динамического массива, так и для статического с нумерацией с нуля. Обдумай его хорошо. Потом сдлай работу над ошибками.


 
Anatoly Podgorestky   (2003-04-25 17:19) [5]

Как думаешь в buf в вызове это @buf или @buf[0], учитывая что параметр объявлен ка ... var Buf; ...


 
Palladin ©   (2003-04-25 17:26) [6]


> Alek Silverstone © (25.04.03 14:45)

нахал


 
Alek Silverstone ©   (2003-04-25 20:48) [7]

>icWasya
Прошу прощения, сразу после отправки того сообщения я раскаялся, но как его отредактировать не нашёл. Извиняюсь.

Всем:
Как это сделать по-другому я знаю. НО! мне хотелось бы просто ПОНЯТЬ, почему мои примеры не работают? Я, кстати, нашёл в книге, что этот код не работает в D4 из-за неточностей в Blockread/Write, но что это исправленно в 5 и 6.


 
Palladin ©   (2003-04-25 20:54) [8]

это все враки, не верь этому, авторы (или переводчики) отнюдь не мастера...
кто то уже жаловался по этому поводу.


 
Palladin ©   (2003-04-25 20:58) [9]

а не работают потому что
BlockRead BlockWrite
работают не с самой переменной, а с ее адресом
ты передаешь в BlockRead/Write не тот адрес
Buf (дин массив) - это область размером в 4 байта (в Win32) представляющая собой указатель, в эту область ты и предлагаешь записать, но записывать надо не в нее, а туда куда она указывает.
тоесть передавая Buf[Low(Buf)] мы передаем в BlockRead/Write адрес начального элемента в массиве, куда благополучно все пишется.


 
Snap ©   (2003-04-25 20:59) [10]

Кстати блокреад наскольо я знаю в паскале работал только с записями до 64 кило. В дельфи это ограничение имхо тоже есть. Так что ещё размер надо учесть.


 
Alek Silverstone ©   (2003-04-25 21:05) [11]

Люди, простите меня!
У меня, наверное, только сейчас голова начала работать... Мне с самого начала дали правильный совет, а я, ввиду своих ограниченных возможностей, его не понял. Простите все!


 
Palladin ©   (2003-04-25 21:07) [12]


> Snap © (25.04.03 20:59)

в d5 и d6, BlockRead/Write, прекрасно работает с размером и превышающим 64к
в версиях ниже не в курсе


 
Alek Silverstone ©   (2003-04-25 21:07) [13]

Последнее сообщение я написал ещё не читая объяснения Palladin"а, но всё равно спасибо.



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

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

Наверх




Память: 0.49 MB
Время: 0.038 c
1-23157
Andy BitOff
2003-04-23 23:22
2003.05.08
Почему не раздвигается форма?


7-23410
hawkins
2003-03-15 08:34
2003.05.08
где в системном реестре хранятся ссылки Избранного Internet Exp


1-23137
Fighter
2003-04-28 09:42
2003.05.08
Прокрутка в TScrollBox


1-23071
1111а
2003-04-24 23:09
2003.05.08
Возможно ли сделать прозрачным (Transparent) фон TEdit?


3-23001
pirat
2003-04-16 22:06
2003.05.08
BDE, ODBC, MIDAS, ADO. Что лучше ?