Текущий архив: 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.47 MB
Время: 0.009 c