> -- kekc_leader писал(а):
> Ведь массив объявлен Обероновский, без [untagged]. Только запись SDL.Rect помечена как [untagged], и размер её заранее известен. Почему же нельзя написать NEW(font.sprites, font.charRows, font.charsInRow)? При этом КП сохранил бы в метаданных для массива его длину, чтобы можно было освободить память, а элементами массива были бы «непомеченные» записи, длиной в N байт.
По той же самой причине - рантайм должен знать тип элемента, так как массив объявлен обероновский, то сборщик мусора будет обходить его элементы, а так как элементы структурные - запись, - то должна присутствовать служебная информация от этой записи.
На самом деле, если постараться, то и под untagged можно выделить память, но ни к чему хорошему это не приведет.
Также можно выделит память, через, например, winApi, и замаппить эту сырую память на указатель на untagged массив с untagged записями. И потом не забыть освободить. Но это тоже не айс.
Можно создать дополнительный тип - обероновскую запись такой же структуры как и untagged, и просто при запросе от SDL присваивать значение элементу массива. А при вызове процедуры предварительно копировать в untagged локальную переменную и ее передавать в качестве ссылки.