Блочное сохранение в типизированный файл

Полезно, но точно не базовая фича языка. В типизированные файлы так просто мне страшно влазить - вот, я вижу в контексте среди других данных стек стеков типизированных файлов на случай сохранения контекста. Сломать - проще лёгкого. А контексты используются в лямбдах.

@Admin вот.

Я сделал в виде репозитория, чтоб я мог менять со временем. Вам нужно лишь сделать чтоб файлы из этого репозитория копировались в ваш, во время сборки или тестирования компилятора. В Readme.md описано как именно что копировать. Я туда пока из примеров и тестов только всякую мелочь засунул, хочу сначала удостоверится что это всё не зря. Вас всё устраивает в том как я сделал?

чего чего? стек стеков? Можете подробнее объяснить?

Только не в лямбды! УМОЛЯЮ !!! Запаримся потом баги ловить. При мне раз было что-то - треть языка улетела на сутки с лишним.

Ага. Сделаю в ближайшее время.

Есть у кого идеи что в примеры добавить? Можете файлом скринуть, я посмотрю и скорее всего добавлю.

тем, что оно не покрывает весь функционал file of. Но как отдельная быстрая реализация блочных файлов записей (без множеств, массивов и прочего) имеет право на существование

  1. Приведите мне хоть 1 программу где множества записываются в file of T. У меня это не работает
  2. Он легко может покрыть весь тот же функционал, но для этого надо или сделать value-типовые строки и массивы встроенными, или добавить шаблоны - не_типы. В таком случае получится типовый файл который действительно покрывает все задуманные возможности. А ваш - тоже покрывает не все. Я уже сколько раз вам сказал - есть проблемы вроде не сохранения приватных поле. И их вашими костылями не решить. Зато в моём способе всё нормально на этом фронте.

Да чего там решать. Просто в Type.GetFields передать флаг, чтобы приватные поля добавлялись.

нет, массивы и строки в .NET ссылочные и пусть остаются такими. и потом, в .NET все уже украдено до нас:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct StringInfoA {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public String f2;
}

Проверьте в своей библиотеке, как там запись в памяти располагается.

1 лайк

TestSuite/fileof3.pas, fileofset1.pas

uses System.Runtime.InteropServices;

type 
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
TRec = record
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=5)]
s: string[5];
[MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
arr: array of integer;
end;

begin
  var r: TRec;
  writeln(sizeof(TRec));
  r.arr := new integer[5];
  r.arr[0] := 2;
  r.s := 'abcd';
end.

Это и не может работать. Типизированный файл имеет записи строго фиксированной длины. Это причина, по которой в него нельзя писать строки, отличные от коротких. Также в него нельзя писать никакие динамические объекты. Только статика.

Нет, это работает, потому что их сохраняет по значению а не ссылке. Но тут такая проблема: если записать new integer[10] в r.arr - что будет? А оно разрешает. И где хранится размер строки? Первые её 4 байта (меньше 4 не даёт сделать, даже если поставить SizeConst меньше 4), а нам надо чтоб был только 1 байт. Наверное, это тоже можно как то решить…

Тогда оно работает неверно, потому что это дискредитирует идею подвода записи по Seek через длину записи и их количество.

что неверно работает? где?

Я написал, что если работает возможность писать в типизированный файл записи с изменяющейся длиной, это неверно. Иначе говоря, если записи разной длины, при подводе нужной надо читать каждую и разбираться, где она заканчивается. Это тупое и непроизводительное решение. Но если вдруг его допустить, то надо допустить запись строк переменной длины и иных динамических объектов. Т.е. это уже будут не паскалевские типизированные файлы.

У неё не изменяется длина, в том то и дело. Посмотрите - там статичную длину специально поставили атрибутами. Но появляется куча проблем с тем что 1 поле налазит на другое.

А как тогда можно туда множество писать, где неизвестно число членов?

Оно побитово записывает. Каждый бит означает если ли элемент с тем же номером что и номер бита в множестве. Если я правильно понял. То есть тут: var s: set of byte := [3..5] будет сохранено как 256 бит и биты от 3 до 5 будут 1, остальные 0.

А множества из 300 элементов Вы не допускаете?

Я понимаю, хочется быть продвинутее какого-то там Вирта, авторов файловой системы IBM \360-\390, разработчиков языков уровня PL/1 - им не удалось решить проблему сохранения в файл с фиксированной длиной записи структур с произвольной длиной, но… вряд ли у Вас получится.

Это уже не ко мне, я не тестрировал но у разработчиков как то это удавалось. Попробуйте записать set of byte, set of word, set of integer в типизированный файл.