OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 20 Май, 2019 16:27

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




Начать новую тему Ответить на тему  [ Сообщений: 65 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Воскресенье, 21 Апрель, 2019 23:58 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8089
Откуда: Троицк, Москва
Удивлён.

Цепочка литер нулевой длины -- и массив нулевой длины -- всё-таки две совершенно разные вещи.

О непременном выделении места под нуль элементов речи тоже нет -- доступа-то к ним не будет (стандартные обероновские проверки границ массивов не дадут).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 19:43 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2300
Откуда: Россия, Санкт-Петербург
Info21 писал(а):
О непременном выделении места под нуль элементов речи тоже нет -- доступа-то к ним не будет (стандартные обероновские проверки границ массивов не дадут).


Info21 писал(а):
Спасибо, но у динамического массива есть уникальный дескриптор.


Я, возможно, чего-то недопонял. Я только лишь хотел сказать, что если разрешить использовать nil в качестве массива нулевой длины, то никакого дескриптора у него не будет. Этот особый случай должен поддерживаться компилятором.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Понедельник, 22 Апрель, 2019 22:47 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8089
Откуда: Троицк, Москва
Если ... то ... должен ...

Понятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Вторник, 23 Апрель, 2019 19:17 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 327
Александр Ильин писал(а):
Идея выделить память, но иметь в ней ноль элементов, - несколько экстравагантная, на мой взгляд.

Info21 писал(а):
О непременном выделении места под нуль элементов речи тоже нет -- доступа-то к ним не будет (стандартные обероновские проверки границ массивов не дадут).

Видимо, выше был акцент (неоднократно) не на выделении как таковом ячеек памяти для хранения элементов (ноль элементов в данном случае), а на распределении в куче дескриптора массива (и прочих необходимых скрытых метаданных) и инициализации указателя (фактически, не содержащего ссылки на прикладные данные). Такова природа ссылочного типа потенциальных динамических массивов нулевой длины (а без них вряд ли проблематика имеет смысл, недостаточно каких-то статических нулевых массивов на стеке или в качестве глобальной переменной, если вдруг таковы возможны). Напр.:
Код:
VAR arr1, arr2: POINTER TO ARRAY OF INTEGER;
    N: INTEGER;
...
N := some_expression;
NEW(arr1, N);
NEW(arr2, N);
...

Пусть для NEW разрешены нулевые значения для "измерений" массива. Однако, даже в случае N = 0 и для arr1, и для arr2 необходимо выделять места в куче (без ячеек для предметных данных), и адреса в arr1 и arr2 должны быть уникальными (чтобы в целом обеспечить семантику указательных типов).

В общем, такая ссылочная типизация для массивов (базовых встроенных) распространена в мэйнстриме. Решения в Objесt Pascal, видимо, как и в Active Oberon, позволяют избегать выделений в куче для пустых динамических массивов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Вторник, 23 Апрель, 2019 19:23 

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 327
Александр Ильин писал(а):
В Delphi (Object Pascal) строка нулевой длины (массив) равна nil. Все такие строки, соответственно, тождественны, что логично.
Length(nil) = 0.
SetLength(s, 15), где s = nil, вызовет выделение памяти в переменную s.
s[0] -> Access Violation, если проверка диапазонов не дремлет.

Вроде бы, явный nil применим в тамошних строках вида PChar (и производные), т.е. в строках "в стиле Си", которые по сути есть те же явные ссылочные типы. Строки вида string (и их вариации), как и динамические массивы, технически по сути есть указатели, но их внутреннее устройство скрыто. Такие типы являются value-объектами. Однако, возможно явное приведение к типу pointer, пустые строки и массивы выдают nil. А вот приведение пустых строк вида string к PChar не выдает nil, а некий адрес, указывающий на нулевой байт (или байты для "широких" строк). На практике все пустые строки "привязаны" к одному и тому же адресу, который может быть размещён статически, а не в динамической куче. Иными словами, для таких value-строк и динамических массивов нет никаких "обязательств" ссылочных типов, возможна любая внутренняя реализация с необходимыми оптимизациями.
Александр Ильин писал(а):
Я, возможно, чего-то недопонял. Я только лишь хотел сказать, что если разрешить использовать nil в качестве массива нулевой длины, то никакого дескриптора у него не будет. Этот особый случай должен поддерживаться компилятором.

Для этого необходимы иные встроенные типы или средства в языке для реализации подобных типов.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 65 ]  На страницу Пред.  1, 2, 3, 4

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


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

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


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

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