Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-31212
zoolmox
2003-06-27 16:21
2003.07.10
OLE


3-31106
victor_ch
2003-06-13 10:17
2003.07.10
Подключение к MSsql серверу


1-31339
Bless
2003-06-26 10:59
2003.07.10
Поменять область видимости метода


1-31209
Ученик
2003-06-28 09:52
2003.07.10
Проблема со свойством TForm.Visible


1-31282
kudatsky
2003-06-26 12:09
2003.07.10
Ini-файл под Win-2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский