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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2008, 11:09   #1
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию Сохранение в файл сложной динамической структуры

Вот представьте себе, что есть несколько двунаправленных динамических списков, элементами которых являются рекорды. В этих рекордах помимо данных и указателей на предыдущие и следующие элементы находятся указатели на элементы других списков. Короче, хренова паутина. Как такую штуку сохранить в файл, а потом воссоздать в памяти в изначальном виде? Вернее как это сделать проще всего?
_Инженер_ вне форума Ответить с цитированием
Старый 02.10.2008, 11:29   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Проще всего никак. Я вот щас пишу прогу одну...у меня там типа этого. Есть узлы и в каждом из них может хранится другой узел. Сначала хранил в ini но понял что это ерунда, хотя работало. Сделал в xml все нормально и красиво Можете сделать и в своем формате. Какая именно цель и проблема ?
BOBAH13 вне форума Ответить с цитированием
Старый 02.10.2008, 13:51   #3
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию

Пользователь вводит данные о линиях электропередач и магистральном нефтепроводе, идущих рядом. В результате образуется огромная переплетенная структура такого вида, как я написал в первом посте. Естественно при этом последовательно создаются элементы динамических списков и плетутся взаимосвязи.
Потом человеку надо все сохранить....и загрузить вновь. И продолжить ввод данных.
Вот мне и видится, что придется изобретать как все это засунуть в файл. Потом надо будет достать из файла. Потом нужен будет интерпретатор всего этого, который и воссоздаст структуру в памяти. Основная проблема во времени.
А нет ли чего-нибудь попроще, чего я не знаю?
_Инженер_ вне форума Ответить с цитированием
Старый 02.10.2008, 14:23   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от _Инженер_ Посмотреть сообщение
...Вот мне и видится, что придется изобретать как все это засунуть в файл. Потом надо будет достать из файла. Потом нужен будет интерпретатор всего этого, который и воссоздаст структуру в памяти. Основная проблема во времени.
А нет ли чего-нибудь попроще, чего я не знаю?
Писать процедуры записи/чтения все-равно придется. Вместо "интерпретатора", вот, например, несложный способ.

При сохранении ссылки сохраняем ее тип (символьное описание или код), саму ссылку записывает в список (локальная переменная) если там ее еще нет, а в файл сохраняем номер ссылки в списке. Когда сохраняем объект, сначала сохраняем ссылку на него а потом все данные.

Для восстановления используется свой список. Читаем тип объекта и номер. Если номер уже есть в списке, объект уже создан и мы можем использовать ссылку на него, если номера еще нет в списке, по описанию типа создаем объект и сохраняем ссылку на него в список.

Еще можно почитать про сериализацию объектов.

----------
Можно усложнить структуру - каждому объекту присвоить ID и заменить все ссылки на ID объектов. Придется делать механизм для замены ID на ссылку, зато сохранение в файл будет простым.

Последний раз редактировалось alexBlack; 02.10.2008 в 14:29.
alexBlack вне форума Ответить с цитированием
Старый 02.10.2008, 15:03   #5
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию

Что ж спасибо всем за идеи, буду думать.
_Инженер_ вне форума Ответить с цитированием
Старый 02.10.2008, 15:30   #6
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию

А если я буду иметь массив рекордов. Рекорды будут иметь несколько десятков разнотипных полей. То как бы мне такой массив загнать в файл, например бинарный, а потом обратно?
Массив будет содержать рекорды такого типа:
TPointMN = Record
//описание параметров одной точки МН
comment_MN1 : string; //комментарий для МН1
fragment_status : array [0..2,0..2] of byte;

KolVL : shortint; // количество ВЛ
KolMN : shortint; // количество МН
p : real; // удельное электрическое сопротивление грунта
ln : integer; // Расстояние от начала участка сближения до данной точки
ln_obj: integer; // Расстояние до предыдущего объекта
SetZu_MN1 : boolean; // установлено ЗУ в этой точке или нет на МН1

NumOBJ : integer; // номер любого объекта, даже если это пикет,
// установленного в этой точке
Rrast : real; // Сопр. растеканию расчитанное для данного ЗУ
RnumOBJ : string; // номер объекта по карте
TypZU_MN1 : integer; // вид устройства заземления на МН1;

d_MN1 : real; // наружный диаметр трубы
s_MN1 : real; // толщина изоляционного покрытия трубопровода
e_MN1 : real; // относительная диэлектрическая проницаемость изоляции
mu_MN1 : real; // относительная магнитная проницаемость стали
Ri_MN1 : real; // переходное электрическое сопротивление изоляционного покрытия
Rst_MN1 : real; // удельное электрическое сопротивление стали
a1_MN1 : integer; // расстояние между осью ВЛ 1 и МН 1
a2_MN1 : integer; // расстояние между осью ВЛ 2 и МН 1
a3_MN1 : integer; // расстояние между осью ВЛ 3 и МН 1
EDS_MN1 : real; // приведенная продольная ЭДС


// Тип ВЛ описан как:
// 1 - ВЛ 110 кВ, одноцепная, опора П110-3
// 2 - ВЛ 110 кВ двухцепная, опора П110-2
// 3 - ВЛ 220 кВ одноцепная, опора П220-3
// 4 - ВЛ 220 кВ, двухцепная, опора П220-2
// 5 - ВЛ-330 кВ, одноцепная, опора П330-3
// 6 - ВЛ-330 кВ, двухцепная, опора П330-2
// 7 - ВЛ 500 кВ, опора ПБ2Т
Type_VL1 : shortint; // тип ВЛ 1
Type_VL2 : shortint; // тип ВЛ 2
Type_VL3 : shortint; // тип ВЛ 3

Imax_VL1 : real; // Максимальный ток ВЛ 1
Ulin_VL1 : real; // Напряжение линейное ВЛ 1

Imax_VL2 : real; // Максимальный ток ВЛ 2
Ulin_VL2 : real; // Напряжение линейное ВЛ 2

Imax_VL3 : real; // Максимальный ток ВЛ 3
Ulin_VL3 : real; // Напряжение линейное ВЛ 3

//Массивы, хранящие информацию, о принадлежности к фрагментам от разных ВЛ
//Номер ВЛ соответствует номеру элементов массивов от 0 до 2-х

//Массив о состоянии объекта: 0 - значит здесь не проходит данная ВЛ, 1 - здесь
//начинается фрагмент данной ВЛ, 2 - здесь продолжается фрагмент данной ВЛ,
//3 - здесь конец фрагмента данной ВЛ, 4 - объект является концом одного,
//и началом следующего фрагмента
Sostoyanie : array [0..2] of byte;

//Массив, хранящий длину фрагмента данной ВЛ: 0 - здесь не проходит фрагмент от данной ВЛ,
//X - длина фрагмента
Dlina : array [0..2] of longword;

//Массив о номерах фрагментов от конкретной ВЛ (например 2 - здесь проходит 2-й фрагмент от первой ВЛ)
//1 - а также первый фрагмент от второй ВЛ, 0 - а третья ВЛ тут не образовала фрагментов, а может и вообще не существует
Nomera : array [0..2] of longword;

//Массив, хранящий расстояние до начала фрагмента по каждой ВЛ. -1, если по данной ВЛ тут нет фрагмента
Distance : array [0..2] of integer;

Owner1, Owner2, Owner3 : TPFragment; //указатель на фрагмент-хозяин
next : TPPointMN;
prev : TPPointMN;
end;
_Инженер_ вне форума Ответить с цитированием
Старый 02.10.2008, 16:27   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Если бы не ссылки...

В Вашем случае только поэлементная запись/чтение всех записей.

Если немного изменить структуру:
Код:
TPointMNData = Record
   // сюда вынести все данные и String заменить на ShortString[n]
end;

TPointMN = Record
    data :PointMNData 
    // дальше ссылки
end;
тогда запись данных - просто
fileStream.Write(r.data, sizeof(TPointMNData));

а со ссылками - по вышеприведенному алгоритму.
alexBlack вне форума Ответить с цитированием
Старый 02.10.2008, 16:39   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

XML лучше всего для такого.
BOBAH13 вне форума Ответить с цитированием
Старый 02.10.2008, 16:41   #9
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию

Да, я тоже уже пришел к тому, что буду писать через fileStream. А поясните пожалуйста, зачем этот рекорд в рекорде? И чем плох string? Указатели будут перед записью в файл ликвидированы и заменены стринговыми идентификаторами или вроде того.
_Инженер_ вне форума Ответить с цитированием
Старый 02.10.2008, 16:44   #10
_Инженер_
Пользователь
 
Регистрация: 19.06.2008
Сообщений: 32
По умолчанию

Насчет XML - да, я такие вещи делал из LabVIEW. Но там вместо рекордов кластеры, объединяемые в массивы. Впрочем, одна фигня. Только как это в Дельфи реализовать тоже надо разбираться.
_Инженер_ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка и сохранение в файл rainbow Общие вопросы Delphi 16 27.09.2008 11:35
сохранение структуры (динамические списки очередей) в файле AlenaZ Помощь студентам 2 09.06.2008 20:14
Сохранение в файл Македонский Общие вопросы Delphi 4 05.09.2007 15:04
Сохранение ListView в файл Scorpeon Общие вопросы Delphi 6 12.06.2007 15:51
Сохранение в файл *.*С Noor Общие вопросы C/C++ 6 08.01.2007 22:44