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

Вниз

Проблемы с BlockRead.   Найти похожие ветки 

 
Mihey ©   (2003-06-29 23:05) [0]

Записываю файл карты для игры. Для этого использую следующую процедурку:


procedure SaveMapToFile(Map: String);
var f1: file;
i: Integer;
begin
AssignFile(f1, Map);
Rewrite(f1);

i := scrWidth;
BlockWrite(f1, i, 1);
i := scrHeight;
BlockWrite(f1, i, 1);
BlockWrite(f1, TankMap, 1);

CloseFile(f1);
end;


На всякий случай, TankMap объявлена так:

var
TankMap: array of array of TMapTile;

Размер массива задаётся, TMapTile - это запись, в которой элементы имеют также в качестве типов записи.

Теперь я пытаюсь загрузить это дело вот прямо-таки обратной процедуркой:


procedure LoadEngineMap(Map: String);
var f1: file;
map0width: integer;
map0height: integer;
begin
AssignFile(f1, Map);
Reset(f1);

BlockRead(f1, map0width, 1);
BlockRead(f1, map0Height, 1);
BlockRead(f1, TankMap, 1);

CloseFile(f1);
end;


И вот в этом месте я получаю зависание. Справка по BlockRead и BlockWrite довольно скупа, не нашёл ответа и в книге Архангельского (там на нетипизированных файлах внимание не заостряется). Вомзожно, я неправильно использую параметр Count (=1), или же ошибочно записываю массив, возможно, его следовало бы типизировать. Помогите разобраться?


 
Palladin ©   (2003-06-29 23:22) [1]

при использовании нетипизированых файлов в Reset/Rewrite нужно указывать размер элементов записи... обычно Reset(f1,1);
Blockread(f1,map0width,sizeof(integer));

то же самое справидливо и для записи


 
DrPass ©   (2003-06-29 23:24) [2]

Не используй динамический массив для этого. Иначе придется переделать алгоритм, да и медленнее работать будет.
procedure SaveMapToFile(Map: String);
var f1: file;
i: Integer;
begin
AssignFile(f1, Map);
Rewrite(f1 , 1);

i := scrWidth;
BlockWrite(f1, i, 4);
i := scrHeight;
BlockWrite(f1, i, 4);
BlockWrite(f1, TankMap[0,0], x*y*sizeof(TMapTile));

CloseFile(f1);
end;

где x и y - размеры массива TankMap. Ну а с чтением аналогично.


 
Mihey ©   (2003-06-29 23:28) [3]

Хорошо, попробую, хотя без динамического массива никак. Но почему же эти парамтеры, из-за которых это дело не пашет, являются необязательными?


 
Palladin ©   (2003-06-29 23:34) [4]

потому что при использовании типизированых файлов они не нужны


 
DrPass ©   (2003-06-29 23:39) [5]

Они не необязательные. Это размер блока данных, которые ты считаваешь. По умолчанию 128 байт. А в blockwrite/read третий параметр - количество блоков. Т.е.
Rewrite(f1);
...
BlockWrite(f1, TankMap, 1);
записывает только 128 байт. Причем если TankMap - динамический массив, то записано будет не его содержимое, а 4 байта указателя на него + еще 124 байта хрен знает чего.
А вот
Rewrite(f1, 1);
...
BlockWrite(f1, TankMap[0,0], x*y*sizeof(TMapTile));
пишет нужное количество однобайтных блоков. Но опять же, с одномерным динамическим массивом такая штука пройдет, а вот двумерный динамический, насколько я понимаю, в памяти не лежит непрерывным куском, посему писать и считывать его можно только построчно.


 
Mihey ©   (2003-06-29 23:48) [6]

Хорошо, сейчас попытаюсь в цикле записать каждый элемент массива в файл последовательно.


 
Mihey ©   (2003-06-30 00:02) [7]

Сделал чтение в цикле - всё получилось, хотя пошли ошибки далее по программе, но с этим разберусь. Спасибо вам, вы очень оперативно помогли.


 
app ©   (2003-06-30 00:04) [8]

Нельзя писать/читать такой массив как единое целое, поскольку первое измерение это указатели на второе измерение.
Нужен как минимум цикл.


 
Anatoly Podgoretsky ©   (2003-06-30 00:05) [9]

Извиняюсь не сменил аккаует.


 
Mihey ©   (2003-06-30 00:16) [10]

2 Anatoly Podgoretsky:

В принципе, такой способ я и применил. Действительно, нагловато было бы записывать вот так просто массивы один за другим.


 
Dimaxx ©   (2003-06-30 00:26) [11]

Лучше уж писать file of byte и не париться с размерами записи, а писать просто reset(f1);


 
Mihey ©   (2003-06-30 00:39) [12]

Вообще, можно было бы ещё так вывернуться. Сделать некотурую запись TGameMap, в которую добавить размер карты, саму карту и ещё кучу элементов записи, а потом создать file of TGameMap и один раз эту запись записать.



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

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

Наверх




Память: 0.49 MB
Время: 0.021 c
3-31092
Дмитрий Белькевич
2003-06-16 15:37
2003.07.10
как убрать из DBNavigator а перемещения на несуществующие поля?


14-31460
wizzo
2003-06-23 23:13
2003.07.10
ICQ: восстановить очищенный журнал?


3-31113
rosl
2003-06-17 05:57
2003.07.10
копирование данных в excel


1-31337
Ivan Voronov
2003-06-27 12:44
2003.07.10
TShellListView и что-то подобное


7-31547
BaDeVlad
2003-03-25 14:07
2003.07.10
Свернуть все окна