Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
ВнизПроблемы с 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c