Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2009, 14:03   #1
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию Как записать в файл динамический массив.

У меня есть тип в котором переменная:
Код:
OpcodesList: array [0..1000] of TOpcode;
Я не знаю сколько ячеек понадобится при выполнении программы, поэтому написал 1000.
При сохранении OpcodesList в типизированный файл и он весит 700 кб!, даже при использовании 1-10 ячеек. Чтобы уменьшить размер сохраняемого файла можно сделать так:
Код:
OpcodesList: array of TOpcode;
и устанавливать длинну массива по надобности, но тогда пишется ошибка "needs finalization - not allowed in file type" которая как я понимаю говорит что сохраняемый файл должен быть фиксированной длинны. Как быть?
Вадим Буренков вне форума Ответить с цитированием
Старый 23.07.2009, 14:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как быть?
Определить File of TOpcode и в цикле от low(OpcodesList) до High(OpcodesList) писать поэлементно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.07.2009, 14:17   #3
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Что то я ничего не понял .
Вадим Буренков вне форума Ответить с цитированием
Старый 23.07.2009, 14:23   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

См. BlockRead, BlockWrite.
Somebody вне форума Ответить с цитированием
Старый 23.07.2009, 14:56   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что то я ничего не понял
Если в TOpcode нет динамических структур то:
Код:
var f:file of TOpcode;i:integer;
...
for i:=low(OpcodesList) tо High(OpcodesList) do
 write(f,OpcodesList[i]);
Чеж тут непонятного?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.07.2009, 15:01   #6
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

У меня вот так:


Код:
type
TCompiledScript = packed record
ScriptInfo:TCompiledInfo;
OpcodesList: array of TOpcode; 
end;

type
TCompiledInfo= packed record
LabelList: array [0..10] of integer;
end;

type
TOpcode= packed record
OpcodeNumb:integer;
Param: array [1..3] of shortstring;
end;
Тип TCompiledScript нужно записать в файл.

Цитата:
var f:file of TOpcode;i:integer;
...
for i:=low(OpcodesList) tо High(OpcodesList) do
write(f,OpcodesList[i]);
Будет работать в моем случае?
Вадим Буренков вне форума Ответить с цитированием
Старый 23.07.2009, 15:20   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Будет работать в моем случае?
Должно. shortstring; правда настроаживает но помоему она образмерена... Попробуй, чего спрашивать то...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.07.2009, 21:49   #8
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Не, так не работает . Мне нужно чтоб в один и тот же файл записалась информация из ScriptInfo:TCompiledInfo и
OpcodesList: array of TOpcode. Поэтому я и занес их в тип TCompiledScript.

Последний раз редактировалось Вадим Буренков; 23.07.2009 в 21:54.
Вадим Буренков вне форума Ответить с цитированием
Старый 24.07.2009, 14:14   #9
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Код:
var f: file;
AssignFile(f, 'qq');
Rewrite(f, 1); // don't forget 1
BlockWrite(f, ScriptInfo, sizeof(ScriptInfo)[, BytesWritten]);
BlockWrite(f, OpcodesList[0], sizeof(OpcodesList[0]) * length(OpcodesList)[, BytesWritten]);
CloseFile(f);
Ещё можно (функции из SysUtils):
Код:
var f: Integer;
f := FileOpen('qq', fmOpenRead or fmShareDenyWrite); // f := FileCreate('qq'); if doesn't exist
FileWrite(f, ScriptInfo, sizeof(ScriptInfo));
FileWrite(f, OpcodesList[0], sizeof(OpcodesList[0]) * length(OpcodesList));
FileClose(f);
Здесь f (если Win32) - это хэндл, приведённый к Integer, если хочется, можно использовать WinApi функцию WriteFileGather для записи сразу из нескольких буферов, хотя и без неё хорошо.

Последний раз редактировалось Somebody; 24.07.2009 в 14:16.
Somebody вне форума Ответить с цитированием
Старый 24.07.2009, 15:12   #10
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Спасибо но я уже разобрался.
Вадим Буренков вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прочитать файл и записать данные в массив ChukCha Общие вопросы C/C++ 6 22.02.2009 19:56
Как записать файл в файл программы? Хамяг Общие вопросы Delphi 2 02.11.2008 16:01
Заполнить массив и записать в файл Amery Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 27.05.2008 20:02
Подскажите, как создать динамический массив? snaem Общие вопросы .NET 9 14.05.2008 08:52