Полезно, но точно не базовая фича языка. В типизированные файлы так просто мне страшно влазить - вот, я вижу в контексте среди других данных стек стеков типизированных файлов на случай сохранения контекста. Сломать - проще лёгкого. А контексты используются в лямбдах.
Я сделал в виде репозитория, чтоб я мог менять со временем. Вам нужно лишь сделать чтоб файлы из этого репозитория копировались в ваш, во время сборки или тестирования компилятора. В Readme.md
описано как именно что копировать. Я туда пока из примеров и тестов только всякую мелочь засунул, хочу сначала удостоверится что это всё не зря. Вас всё устраивает в том как я сделал?
чего чего? стек стеков? Можете подробнее объяснить?
Только не в лямбды! УМОЛЯЮ !!! Запаримся потом баги ловить. При мне раз было что-то - треть языка улетела на сутки с лишним.
Ага. Сделаю в ближайшее время.
Есть у кого идеи что в примеры добавить? Можете файлом скринуть, я посмотрю и скорее всего добавлю.
тем, что оно не покрывает весь функционал file of. Но как отдельная быстрая реализация блочных файлов записей (без множеств, массивов и прочего) имеет право на существование
- Приведите мне хоть 1 программу где множества записываются в
file of T
. У меня это не работает - Он легко может покрыть весь тот же функционал, но для этого надо или сделать
value
-типовые строки и массивы встроенными, или добавить шаблоны - не_типы. В таком случае получится типовый файл который действительно покрывает все задуманные возможности. А ваш - тоже покрывает не все. Я уже сколько раз вам сказал - есть проблемы вроде не сохранения приватных поле. И их вашими костылями не решить. Зато в моём способе всё нормально на этом фронте.
Да чего там решать. Просто в Type.GetFields передать флаг, чтобы приватные поля добавлялись.
нет, массивы и строки в .NET ссылочные и пусть остаются такими. и потом, в .NET все уже украдено до нас:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
struct StringInfoA {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] public String f2;
}
Проверьте в своей библиотеке, как там запись в памяти располагается.
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
в типизированный файл.