|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
02.10.2008, 11:09 | #1 |
Пользователь
Регистрация: 19.06.2008
Сообщений: 32
|
Сохранение в файл сложной динамической структуры
Вот представьте себе, что есть несколько двунаправленных динамических списков, элементами которых являются рекорды. В этих рекордах помимо данных и указателей на предыдущие и следующие элементы находятся указатели на элементы других списков. Короче, хренова паутина. Как такую штуку сохранить в файл, а потом воссоздать в памяти в изначальном виде? Вернее как это сделать проще всего?
|
02.10.2008, 11:29 | #2 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Проще всего никак. Я вот щас пишу прогу одну...у меня там типа этого. Есть узлы и в каждом из них может хранится другой узел. Сначала хранил в ini но понял что это ерунда, хотя работало. Сделал в xml все нормально и красиво Можете сделать и в своем формате. Какая именно цель и проблема ?
|
02.10.2008, 13:51 | #3 |
Пользователь
Регистрация: 19.06.2008
Сообщений: 32
|
Пользователь вводит данные о линиях электропередач и магистральном нефтепроводе, идущих рядом. В результате образуется огромная переплетенная структура такого вида, как я написал в первом посте. Естественно при этом последовательно создаются элементы динамических списков и плетутся взаимосвязи.
Потом человеку надо все сохранить....и загрузить вновь. И продолжить ввод данных. Вот мне и видится, что придется изобретать как все это засунуть в файл. Потом надо будет достать из файла. Потом нужен будет интерпретатор всего этого, который и воссоздаст структуру в памяти. Основная проблема во времени. А нет ли чего-нибудь попроще, чего я не знаю? |
02.10.2008, 14:23 | #4 | |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Цитата:
При сохранении ссылки сохраняем ее тип (символьное описание или код), саму ссылку записывает в список (локальная переменная) если там ее еще нет, а в файл сохраняем номер ссылки в списке. Когда сохраняем объект, сначала сохраняем ссылку на него а потом все данные. Для восстановления используется свой список. Читаем тип объекта и номер. Если номер уже есть в списке, объект уже создан и мы можем использовать ссылку на него, если номера еще нет в списке, по описанию типа создаем объект и сохраняем ссылку на него в список. Еще можно почитать про сериализацию объектов. ---------- Можно усложнить структуру - каждому объекту присвоить ID и заменить все ссылки на ID объектов. Придется делать механизм для замены ID на ссылку, зато сохранение в файл будет простым. Последний раз редактировалось alexBlack; 02.10.2008 в 14:29. |
|
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 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Если бы не ссылки...
В Вашем случае только поэлементная запись/чтение всех записей. Если немного изменить структуру: Код:
fileStream.Write(r.data, sizeof(TPointMNData)); а со ссылками - по вышеприведенному алгоритму. |
02.10.2008, 16:39 | #8 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
XML лучше всего для такого.
|
02.10.2008, 16:41 | #9 |
Пользователь
Регистрация: 19.06.2008
Сообщений: 32
|
Да, я тоже уже пришел к тому, что буду писать через fileStream. А поясните пожалуйста, зачем этот рекорд в рекорде? И чем плох string? Указатели будут перед записью в файл ликвидированы и заменены стринговыми идентификаторами или вроде того.
|
02.10.2008, 16:44 | #10 |
Пользователь
Регистрация: 19.06.2008
Сообщений: 32
|
Насчет XML - да, я такие вещи делал из LabVIEW. Но там вместо рекордов кластеры, объединяемые в массивы. Впрочем, одна фигня. Только как это в Дельфи реализовать тоже надо разбираться.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Загрузка и сохранение в файл | 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 |