zub писал(а):если нужен только некст - его надо не сохранять, а восстанавливать при загоузке.
Вот тут меня и осенило

- Код: Выделить всё
if Ofs(AnyP^.Next^) - Ofs(AnyP^) <> SizeOf(P) then {Палец в небе}
else {Реальные данные}
...или я не прав?
Добавлено спустя 10 минут 18 секунд:Я ведь не реальный пример привел выше, а только для объяснения. Дело в том, что не всегда Next может быть инициализирован и восстановление данных производится не линейно, а "древовидно" на основе того, что:
- была ли ссылка из конкретного элемента связанного списка на другой (об этом говорит наличие или отсутствие какого-либо адреса в "Next");
- найдены-ли уже данные для указателя конкретного элемента или нет (об этом должен сказать или "Палец в небе", или "Реальные данные"), и если еще нет, то инициализировать указатель и присвоить данные;
- и другое...
При чем файл этот - нестандартная база и придумана не мной. А вот работать с ней мне как-то нуна.
Добавлено спустя 5 минут 57 секунд:Хотя, наверное, правильней будет:
- Код: Выделить всё
if ((Ofs(AnyP^.Next^) - Ofs(AnyP^)) mod SizeOf(P)) <> 0 then {Палец в небе}
else {Реальные данные}
Хотя и это не факт... млин...
Добавлено спустя 10 минут 7 секунд:Вот, что пишет сам разработчик об этом файле:
- Код: Выделить всё
{ Стpуктуpа записи файла CAS.RUL }
{ Размеp записи: 321 байт }
{ ??? - значение поля на диске несущественно, но лучше обнулить }
const
ListLimit = 15;
type pCas = ^CasType;
ListType = array [1..ListLimit] of pCas;
CasType= record
{ 1} Group :boolean; { Пpизнак ветвь/лист (false/true) }
{ 4} Parent :pCas; { Ссылка на ветвь-pодителя ??? }
{ 51} Name :string[50]; { Текст ветви или листа }
{ 4} BalloonL :longint; { Пpизнак наличия баллона }
{ 201} BalloonS :string[200];{ Текст баллона }
{15*4} List :ListType; { ссылки на потомков }
end;
При чем разница между смежными адресами не 321, а 172 (это я вычислил из сохраненных в файл адресов памяти);