OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 21 Май, 2024 22:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Указатель на массив
СообщениеДобавлено: Воскресенье, 23 Декабрь, 2007 11:58 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Уважаемые коллеги!
Подскажите пожалуйста, как корректно переписать с C++ на КП следующую конструкцию:

unsigned char* buffer = new unsigned char[frame_width * frame_height * 3];
... работа с массивом
unsigned char* buffer_part = buffer + frame_width * 3 * 20 + 3 * 20;
т.е. получить указатель на часть массива и использовать ее как новый массив меньшего размера.

Как вообще реализовать адресную арифметику или чем ее заменить?
Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на массив
СообщениеДобавлено: Воскресенье, 23 Декабрь, 2007 13:36 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Димыч писал(а):
Уважаемые коллеги!
Подскажите пожалуйста, как корректно переписать с C++ на КП следующую конструкцию:

unsigned char* buffer = new unsigned char[frame_width * frame_height * 3];

Примерно так:
Код:
p: POINTER TO ARRAY OF SHORTCHAR;
...
NEW(p, frame_width * frame_height * 3);


Димыч писал(а):
Как вообще реализовать адресную арифметику или чем ее заменить?
Спасибо.

Смотря для чего Вы используете адресную арифметику.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на массив
СообщениеДобавлено: Воскресенье, 23 Декабрь, 2007 13:44 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Цитата:
т.е. получить указатель на часть массива и использовать ее как новый массив меньшего размера.

Сначала давайте разберёмся, для чего это нужно. Может быть, лучше использовать многомерный массив? Учитывайте, что в С/С++ такие массивы толком не поддерживаются, и часто их эмулируют в одномерном, "играя" индексами. В КП же прекрасная поддержка многомерности.
Если же требуется просто часть линейного массива, почему явно не использовать индексы интервала [beg, end)?
Предположим, группа функций работает с фрагментами массива - ну и передавайте POINTER TO ARRAY... и пару beg, end. Если же работает не просто группа функций, а это это как-то выносится в интерфейс какой-то библиотеки, то хороший тон вообще обернуть это в отдельный тип. Например, сделать тип Array, у которого есть метод GetElems(i, count: INTEGER; OUT elems: ARRAY OF BaseType) и GetSubArray (beg, end: INTEGER): Array.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на массив
СообщениеДобавлено: Воскресенье, 23 Декабрь, 2007 17:42 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Илья Ермаков писал(а):
Цитата:
т.е. получить указатель на часть массива и использовать ее как новый массив меньшего размера.

Цитата:
Сначала давайте разберёмся, для чего это нужно.

Есть задумка перевести на 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].

Цитата:
Однако это КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ. При обращении с таким "диким подмассивом", поскольку он безтеговый, не будет выполняться проверка выхода за границы (не то что подмассива, но даже и базового массива), т.е. вся безопасность памяти идёт лесом. Кроме того, подмассив не будет являться якорем для сборщика мусора. Т.е. если ссылка на подмассив есть, а ссылка на базовый уже исчезла, он будет собран сборщиком, и при обращении к подмассиву Вы получите фатальный сбой...


Еще предстоит поэкспериментировать, но над механизмом двумерного массива я подумаю...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на массив
СообщениеДобавлено: Воскресенье, 23 Декабрь, 2007 18:46 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
А Вы смотрели порт AGG на Object Pascal? Может быть, его перенести на Оберон легче, чем С++-сный оригинал?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на массив
СообщениеДобавлено: Воскресенье, 23 Декабрь, 2007 18:59 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
IMHO, типовой пример работы с подмассивами на Обероне (Модуле, Паскале) - быстрая сортировка Хоара.
Например, см. 2-ю главу ADS (Algorithms and Data Structures).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Указатель на массив
СообщениеДобавлено: Среда, 26 Декабрь, 2007 12:13 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Илья Ермаков писал(а):
А Вы смотрели порт AGG на Object Pascal? Может быть, его перенести на Оберон легче, чем С++-сный оригинал?


Смотрел, конечно, с нее и перевожу.
AGGPAS использует ту же адресную арифметику, переписанную на Паскаль :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB