Цитата:
т.е. получить указатель на часть массива и использовать ее как новый массив меньшего размера.
Цитата:
Сначала давайте разберёмся, для чего это нужно.
Есть задумка перевести на XDS/CP библиотеку
Anti-Grain Geometry. Причем не просто сделать подгружаемую DLL и импортировать ее, а полностью переписать на Oberon.
Цитата:
Может быть, лучше использовать многомерный массив? Учитывайте, что в С/С++ такие массивы толком не поддерживаются, и часто их эмулируют в одномерном, "играя" индексами.
Именно так это и реализовано в AGG.
Цитата:
Если же требуется просто часть линейного массива, почему явно не использовать индексы интервала [beg, end)?
Я хотел использовать интервальный механизм, но это меняет логику алгоритмов. По крайней мере это меняет логику самого низкого слоя кода.
Цитата:
Эмулировать Си можно, но крайне не рекомендуется. Для этого нужно использовать средства псевдомодуля SYSTEM (см. документацию ББ "Особенности платформы" (Platform-Speciffic Issues)). Тогда указатель на подмассив объявляется как TYPE SubArray = POINTER TO ARRAY [untagged] OF BYTE и затем берётся так: suba = SYSTEM.VAL(SubArray, SYSTEM.ADR(array[i])).
Собственно, вопрос я задал тогда, когда такой код у меня получился на XDS, но не получился на CP. Вопрос состоял в атрибуте [untagged].
Цитата:
Однако это КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ. При обращении с таким "диким подмассивом", поскольку он безтеговый, не будет выполняться проверка выхода за границы (не то что подмассива, но даже и базового массива), т.е. вся безопасность памяти идёт лесом. Кроме того, подмассив не будет являться якорем для сборщика мусора. Т.е. если ссылка на подмассив есть, а ссылка на базовый уже исчезла, он будет собран сборщиком, и при обращении к подмассиву Вы получите фатальный сбой...
Еще предстоит поэкспериментировать, но над механизмом двумерного массива я подумаю...