Форум «Всё о Паскале» _ Теоретические вопросы _ Массив [0..0] ов байт
Автор: Билли Боб 17.09.2011 6:41
Когда указываю этот массив в своей процедуре, то возникает ошибка 200 на процедуре BlockRead, а если указать масссив в основной программе, ошибки нет. Что не так?
Автор: IUnknown 17.09.2011 11:59
Показывай код процедуры, что-то там не так. Вот такая процедурка:
procedure p(var f : file); var buffer: array[0 .. 0] of byte; begin writeln(sizeof(buffer)); while not eof(f) do begin blockread(f, buffer, 1); writeln(buffer[0]); end; end;
совершенно нормально отрабатывает, безо всяких ошибок. Да, файл открывался через reset(f, 1);
Автор: Билли Боб 17.09.2011 19:41
Вот так работает правильно:
var b: array [0..0] of byte;
procedure rd (name: string); var f: file; begin assign(f,name); reset(f,1); blockread (f, b,400); close(f); end;
begin rd ('bitmap.bmp'); end.
А вот так выдает ошибку, теперь уже File not found:
procedure rd (name: string); var b: array [0..0] of byte; f: file; begin assign(f,name); reset(f,1); blockread (f, b,400); close(f); end;
begin rd ('bitmap.bmp'); end.
Добавлено через 8 мин. Еще заметил, что если указать меньше 260 записей, то ошибки не возникает.
Автор: IUnknown 17.09.2011 20:26
Цитата
Вот так работает правильно:
Тебе очень повезло. На самом деле происходит вот что:
Цитата
BlockRead reads Count or fewer records from the file F into memory, starting at the first byte occupied by Buf.
То есть, первый прочитанный байт размещается в b[0], а остальные 399 - следом за ним, где бы это ни было, и что бы там не находилось - оно будет испорчено. Проверь: размести следом за глобально описанной переменной b еще какой-нибудь буфер, и посмотри, в момент чтения из файла, как значения его элементов изменятся, хотя ты фактически читаешь в b. То, что программа не вылетает сразу при глобальном описании буфера - это только положение звезд на небе и размеры Большого Красного Пятна на Юпитере тебя спасают Но какие-то данные однозначно портятся.
Если серьезно - нужно, чтобы в буфер помещалось необходимое количество данных, то есть, размер буфера в твоем случае должен быть не меньше, чем (400 блоков * 1 байт = размер одного блока) = 400 байт. У тебя буфер может содержать один байт, с индексом 0. Или ты думал, что при задании 0 .. 0 выделится столько, сколько нужно? Нет, не выделится, обеспечить достаточный размер буфера - проблема программиста, BlockRead не проверяет достаточно ли места в буфере, и не выдает никакой ошибки. Равно как и Range Check здесь бессилен...
Автор: Билли Боб 17.09.2011 20:36
Цитата
Или ты думал, что при задании 0 .. 0 выделится столько, сколько нужно?
Как раз так и думал
Но все же при глобальном описании переменной никаких проблем не возникает. У меня там процедура вывода bmp, и рисунки выводятся верно, никаких искажений не было, странно.
Автор: IUnknown 17.09.2011 20:48
Цитата
Но все же при глобальном описании переменной никаких проблем не возникает.
Тебе только кажется Даже если оно и работает - так делать нельзя, потому что перестать работать может в любую секунду.
Цитата
У меня там процедура вывода bmp, и рисунки выводятся верно, никаких искажений не было, странно.
Процедуры - ни при чем, это сегмент кода. А глобальные данные располагаются в сегменте данных.
Вот, кстати:
Цитата
А вот так выдает ошибку, теперь уже File not found: