Помощь - Поиск - Пользователи - Календарь
Полная версия: Массив [0..0] ов байт
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Билли Боб
Когда указываю этот массив в своей процедуре, то возникает ошибка 200 на процедуре BlockRead,
а если указать масссив в основной программе, ошибки нет. Что не так?
IUnknown
Показывай код процедуры, что-то там не так. Вот такая процедурка:

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);
Билли Боб
Вот так работает правильно:

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
Цитата
Вот так работает правильно:
Тебе очень повезло. На самом деле происходит вот что:
Цитата
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. То, что программа не вылетает сразу при глобальном описании буфера - это только положение звезд на небе и размеры Большого Красного Пятна на Юпитере тебя спасают smile.gif Но какие-то данные однозначно портятся.

Если серьезно - нужно, чтобы в буфер помещалось необходимое количество данных, то есть, размер буфера в твоем случае должен быть не меньше, чем (400 блоков * 1 байт = размер одного блока) = 400 байт. У тебя буфер может содержать один байт, с индексом 0. Или ты думал, что при задании 0 .. 0 выделится столько, сколько нужно? Нет, не выделится, обеспечить достаточный размер буфера - проблема программиста, BlockRead не проверяет достаточно ли места в буфере, и не выдает никакой ошибки. Равно как и Range Check здесь бессилен...
Билли Боб
Цитата
Или ты думал, что при задании 0 .. 0 выделится столько, сколько нужно?

Как раз так и думал smile.gif

Но все же при глобальном описании переменной никаких проблем не возникает.
У меня там процедура вывода bmp, и рисунки выводятся верно, никаких искажений не было, странно.
IUnknown
Цитата
Но все же при глобальном описании переменной никаких проблем не возникает.
Тебе только кажется smile.gif Даже если оно и работает - так делать нельзя, потому что перестать работать может в любую секунду.

Цитата
У меня там процедура вывода bmp, и рисунки выводятся верно, никаких искажений не было, странно.
Процедуры - ни при чем, это сегмент кода. А глобальные данные располагаются в сегменте данных.

Вот, кстати:
Цитата
А вот так выдает ошибку, теперь уже File not found:
Теперь понимаешь причину ошибки?
Билли Боб
да, учитель! ))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.