IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Массив [0..0] ов байт
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Когда указываю этот массив в своей процедуре, то возникает ошибка 200 на процедуре BlockRead,
а если указать масссив в основной программе, ошибки нет. Что не так?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Показывай код процедуры, что-то там не так. Вот такая процедурка:

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);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Вот так работает правильно:

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 записей, то ошибки не возникает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
Вот так работает правильно:
Тебе очень повезло. На самом деле происходит вот что:
Цитата
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 здесь бессилен...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


Цитата
Или ты думал, что при задании 0 .. 0 выделится столько, сколько нужно?

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

Но все же при глобальном описании переменной никаких проблем не возникает.
У меня там процедура вывода bmp, и рисунки выводятся верно, никаких искажений не было, странно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


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

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

Вот, кстати:
Цитата
А вот так выдает ошибку, теперь уже File not found:
Теперь понимаешь причину ошибки?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 47
Пол: Мужской

Репутация: -  0  +


да, учитель! ))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.04.2024 19:58
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name