> -- kekc_leader писал(а):
> Оказывается, нельзя использовать NEW на массивах записей без метки (см. тип «M» ниже).Объясните, пожалуйста, почему это считается ошибкой. Ведь R - это записевый тип, размер которого известен в момент компиляции (его же нельзя расширять, т. к. он не помечен словом «EXTENSIBLE», правильно?). То есть R всегда будет занимать 4 байта. Почему же тогда нельзя выделить массив динамически?Вышел из положения тем, что написал:Почему я вообще написал там [untagged]? Потому что этот тип я должен передавать по ссылке в одну из процедур (SDL_FillRect), при этом VAR-параметр надо пометить директивой [nil], а это возможно только с записями, помеченными как [untagged].
Динамическая память в оригинальных Оберонах - типизированая, то есть участки памяти имеют специальную служебную информацию, которую, в том числе, можно использовать для поиска указателей при сборке мусора, что и делается.
Модификатор [untagged] в КП убирает эту информацию. Такие типы используются в низкоуровневом программировании для маппинга или при работе с внешними по отношению к среде выполнения сущностями. В этом случае, внешняя среда предоставляет специальный API для их создания. Т.е. даже если бы в средствами КП можно было выделить такой участок памяти, то непонятно, как и когда его потом освободить в среде с автоматическим управлением памятью. Есть же простое правило - кто память выделил, тот его и освобождает. Я не знаю SDL, но, думается, там есть средства для создания и освобождения таких сущностей. Или "ты что-то делаешь не так".