OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 22 Ноябрь, 2019 16:55

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




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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3109
Откуда: Астрахань
PSV100 писал(а):
Скорее, C++ автоматически не выделяет память и не присваивает адреса нулевым массивам.

Не. Читаем у Герба Саттера "Решение сложных задач на С++" страница 275.
Раздел стандарта 5.3.4.7.
Когда value равно нулю, выделяется массив нулевой длины. Выражение new возвращает ненулевой указатель.
[Примечание: возвращаемый указатель не совпадает ни с одним из указателей на другие объекты]
Сам себя спрашивает: зачем массивы 0 длины, и сам отвечает: код упрощается и обобщается.

Но несколько позже рекомендует вместо динамических массивов использовать vector... :)


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

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 357
С "регуляризацией" согласен, но как быть с такими моментами:
Адрес массива это адрес его первого элемента?
Тогда, если элементов нет (0) , адрес массива - это адрес чего?
Далее, число элементов в массиве хранится по смещению (-1)? И где тода хранится "нуль" если элементов нет?
В коде операции или памяти данных?


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

Зарегистрирован: Воскресенье, 09 Декабрь, 2018 15:14
Сообщения: 54
Откуда: Equestria
Artyemov писал(а):
Адрес массива это адрес его первого элемента?
Чуть по-другому. Адрес массива - это адрес сразу после тэга.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Если всегда есть тэг, то и проблем нет -- просто надо разрешить, и всё. В тэге будет прописан нуль.

Ежу понятно, что раз нет элементов, то и обращение к элементу будет давать трап. И что такие обращения всегда должны быть под охраной вроде i < LEN(a). Опасность тут в точности "выход за границы массивы" и решается теми же средствами.

Для ситуаций вроде модуля Strings требование LEN > 0 это обычное тривиальное предусловие. Как, впрочем, и для всех остальных модулей, написанных при молчаливом предположении, что длина всегда > 0.


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 372
Валерий Лаптев писал(а):
PSV100 писал(а):
Скорее, C++ автоматически не выделяет память и не присваивает адреса нулевым массивам.

Не. Читаем у Герба Саттера "Решение сложных задач на С++" страница 275.
Раздел стандарта 5.3.4.7.
Когда value равно нулю, выделяется массив нулевой длины. Выражение new возвращает ненулевой указатель.
[Примечание: возвращаемый указатель не совпадает ни с одним из указателей на другие объекты]
Сам себя спрашивает: зачем массивы 0 длины, и сам отвечает: код упрощается и обобщается.

Но несколько позже рекомендует вместо динамических массивов использовать vector... :)

Там речь не про сами объекты-массивы как таковы, а про явные указатели на них и динамическое выделение памяти. И, вроде бы, не всё так однозначно в стандартах (указатель может быть и нулевым). Хотел по-быстрому загуглить по стандартам, но сразу же попалась выдержка с ключевыми цитатами (лезть в актуальные дебри стандартов лень, да и незачем):
http://qaru.site/questions/832768/what-is-the-zero-length-array-mentioned-in-the-draft-standard
Цитата:
Я читал проект стандарта N3337 и в сноске 79 (§ 5.3.7 на стр. 110) говорится (подчеркивание мое):

[...] 79) Для массивов без нулевой длины это то же самое, что и указатель на первый элемент массива, созданный этим новым выражением. нулевой длины массивы не имеют первого элемента

У меня создалось впечатление, что С++ не поддерживает массивы нулевой длины.

[...]

Насколько я понимаю, это означает, что новый может быть реализован в терминах malloc, который разрешает запросы нулевого размера. Вы не можете много сделать с ними, поскольку, как отмечено в цитате ниже, разыменование такого указателя имеет поведение undefined.

Мы можем найти обоснование в стандартной сноске 35 стандарта проекта С++, на которую ссылается раздел 3.7.4.1 [basic.stc.dynamic.allocation]:

[...] Даже если размер запрошенного пространства равен нулю, запрос может выйти из строя. Если запрос завершается успешно, возвращаемое значение должно быть значением, отличным от нуля (4.10) p0, отличным от любого ранее возвращаемое значение p1, если только это значение p1 не было передано оператору delete. эффект разыменования указателя, возвращаемого в качестве запроса на нулевой размер, составляет undefined. ^35

и сноска 35 говорит:

[...] Цель состоит в том, чтобы реализовать оператор new(), вызвав std:: malloc() или std:: calloc(), поэтому правила в основном тоже самое. С++ отличается от C тем, что требует нулевого запроса для возврата ненулевого указателя.

Из стандартного раздела проекта C11 7.22.3 Функции управления памятью:

[...] Если размер запрошенное пространство равно нулю, поведение определяется реализацией: либо нулевой указатель, или поведение такое, как если бы размер был отличным от нуля, за исключением того, что возвращаемый указатель не должен использоваться для доступа к объекту.


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 372
В самом деле, решение для Оберона разрешить создание нулевого массива через указатель посредством NEW (и по-другому, вроде бы, ведь никак), согласно стандартам выше, предполагает возможность "требовать нулевого запроса для возврата ненулевого указателя". Иными словами, для объекта вида:
VAR arr: POINTER TO ARRAY OF INTEGER

требовать "new ненулевой pointer в пустоту". Т.е., семантически (понимая саму суть предметки абстрактного массива, без скрытых технических деталей потрохов, ведь они за рамками данного прикладного универсального языка) в итоге тот же С++, только вид сбоку.

Если не ошибаюсь, вроде бы, для А2 есть какие-то расширения, где динамические массивы без явного "pointer to", с константными выражениями массивов и пр., что поближе к "взыскуя научности".


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Почему же в пустоту? Там же будет какой-то тэг -- длина массива на адресе -1. В этой длине будет прописан 0.


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 372
Info21 писал(а):
Почему же в пустоту? Там же будет какой-то тэг -- длина массива на адресе -1. В этой длине будет прописан 0.

На каком адресе? Дали команду: создать объект нулевого размера, т.е. в итоге объект не существует. Какой адрес у несуществующего объекта? И что за тэг такой в понятиях/терминах что есть массив?

Вот всё содержательное, что указано в report-e о языке КП насчёт массивов:
Цитата:
6.2 Типы массивов [array types]

Массив — структура, состоящая из некоторого количества элементов, имеющих один и тот
же тип, называемый типом элементов. Количество элементов массива называется его
длиной. Элементы массива выбираются с помощью индексов, являющихся целыми числами
из диапазоне от 0 до длина минус 1.
[...]
Массивы, описанные без длины, называются открытыми массивами. Их использование ограничено
базовыми типами для указателей (см. 6.4), типами элементов открытых массивов, а также типами
формальных параметров (см. 10.1).

Для массивов нет никакого понятия тэга (и всякого прочего, связанного с внутренностями реализации механизмов в языке). Нет ничего особенного в понимании массивов кроме как, традиционно, простых ячеек данных. В языке есть понятие указателей, выделения памяти, размещения там объектов -- также ничего особенного, всё традиционно. Следовательно, напр., потенциальное выражение для создания "пустого" массива вида:

VAR arr: POINTER TO ARRAY OF INTEGER;
...
NEW(arr, 0);

читается так: создать/инициализировать указатель на объект нулевого размера (ноль ячеек памяти). В общем, обычные "динамические" массивы в стиле С++ с возможностью "требовать нулевого запроса для возврата ненулевого указателя". Разве что нет операции явного удаления/освобождения памяти (к слову, в report-е нет ничего и про операцию аля SetLength). То, что при таком создании объекта, напр., каким-то чудом корректно сможет отработать функция LEN с таким объектом (с каким? ведь нет же никаких ячеек данных) по указателю -- вопрос иной. Семантически же -- указатель какой-то undefined, по конструкции указывает на несуществующий объект.


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 372
У себя нарыл некие статейки (приложены ниже) про расширенные массивы в Active Oberon. Динамические массивы в стиле Delphi/FreePascal, но гораздо более навороченные, с возможностью создавать свои custom-объекты массивов. Для них целенаправленно убрана связь с "pointer to", т.е. динамические объекты-массивы есть value-объекты аля record-ы ("математические объекты"). Явно не инициализированные объекты (или "измерения") по умолчанию есть "пустые".

Ключевое из второй статейки "F. Friedrich, J. Gutknech. Array-Structured Object Types for Mathematical Programming", с.9 (выделение моё):
Цитата:
3 Specification of the Language Extension

In this section the syntax of the new built-in arrays and custom array types
in Oberon is provided. Further some implementation specific notes are stated.
We first recapitulate the status quo of Oberon: In classical Oberon it is not
possible to address sub-arrays that do not form a contiguous block. New array
types with different element access rules, such as sparse matrices, cannot be
added to the system. The dimension order in memory coincides with that of
the notation. From the view of mathematical programming the pointer notation
used in Oberon for dynamic arrays is somewhat unnatural.


И стр. 7-8:
Цитата:
2.3 Concepts of the New Array Types
[...]
For mathematical programming we generally prefer value semantics to refer-
ence semantics as it assures unambiguity of operations, in particular assignment
and test for equality. Consequently, special arrays are value types (like records),
rather than reference types (like objects). Memory allocation and pointer mech-
anisms are performed on behalf of the programmer behind the scenes. The pro-
grammer is only confronted with the definition and usage of fix- or variable-sized
arrays. As a consequence, dynamic arrays are not exposed as pointers to an array
structure: an array may well be of length zero but physically it invariably consists
at least of the descriptor containing information about its shape. The decision
for value semantics does not imply a severe restriction since arrays may still
be wrapped into records or objects. For shared access this would be necessary
anyway since concurrent access is managed by mutual exclusion on an object
level in Oberon. Value semantics can also be regarded as additional protection
against unintentional concurrent access to an array.

Вложение:

Вложение:


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9161
Откуда: Россия, Орёл
Динамические массивы и открытые массивы-параметры на уровне семантики языка = "нечто, к чему применима операция получения динамически известного размера LEN()". Т.е. существование доп. информации, кроме самих данных, задано языком.


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 372
Всё же, это "нечто" попало под некую "дискриминацию". Пустые записи (а record-ы семантически должны быть эквивалентны массивам -- те же структуры, лишь с возможностью иметь элементы разных типов) вида:
TYPE Rec = RECORD
END

создаются "на ура". И в качестве "статических" объектов-переменных, с возможностью операции копирования, и в качестве распределения "пустоты" в памяти через указатели, с поддержкой операций тестирования типа (даже если запись не является EXTENSIBLE, видимо, обеспечивается совместимость с понятием ANYPTR). И, скорее всего, идеология расширения записей (особенно с учётом, что исходная Оберон-методика предполагала все записи расширяемыми), с необходимостью в тестировании типа, сделала record-ы "привилегиро́ванными" на фоне массивов. В том числе record-ами можно "мусорить" в памяти (куче), создавая "пустоты" через указатели. В общем, массивам должно быть "обидно".


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 372
Однако, всё же, потенциальный процесс создания пустого массива вряд ли "красив", если всё-таки апеллировать к "взыскуя научности" (тем более с учётом тесного переплетения понятий указателя и объектов по ним, когда, напр., VAR-параметр процедур ("изменяемый объект") совместим с типом указателей, нет обязательного "разыменования" при ptr[...] и т.д.).
Общая форма вида:
NEW(ptr, x0, ..., xn)

воспринимается, если Xi являются некими выражениями, вычисление которых может привести к нулевому результату.
Однако, в случае явного константного нуля (или константы, содержащей ноль), аля:
VAR arr: POINTER TO ARRAY OF INTEGER;
...
NEW(arr, 0);

как-то нехорошо. Не может быть нового "пустого кортежа", как и нового "пустого множества" и т.п. Таковы "математические объекты" единственны, имеют специальные обозначения (иными словами, на примере тех же указателей, иначе возникает какой-то "NEW NIL", т.е. новый объект NIL, а он в языке единственный).
Обращаю внимание на примере википедии про понятие кортежа, где математическое (именно) определение т.н. "n-ки" предусматривает n от 1 (например, в реляционных СУБД, как правило, нельзя создать "пустой" кортеж, т.е. таблицу без столбцов):
https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D1%80%D1%82%D0%B5%D0%B6_(%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0)

Потенциальное введение константных выражений для массивов, пусть в виде "[1, 2, 3]" с особым объектом "[]", поможет в случае аргументов процедур как открытые массивы (аля при вызове процедуры: "p([])"). Однако, для инициализации переменной-указателя ведь не укажешь аля: "arr := []" (несовместимость типов, в домене указателей свой NIL-объект).
Не прокатят и фокусы вида:
"arr := @[]" или "@arr := @[]"
, поскольку нет оператора "адрес" (да и вообще, уж не "по-математически" все эти адреса..., включая и использование неких функций аля ADR).

Видимо, как компромисс, может быть есть смысл в краткой форме (дополнительно к полной): "NEW(arr)", т.е. с возможностью без указания данных для "измерений" массива, мол осуществляется инициализация указателя, а сам массив как таковой пока неопределенный (с договорённостью в языке, что является "пустым" кортежем).

В целом, направление у товарищей из Active Oberon было верное -- избавиться от эквилибристики на указателях для массивов.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8196
Откуда: Троицк, Москва
Констатирую, что стремление к чистому надёжному коду описывается выражением "взыскуя научности".

Направьте эту иронию на цифру "0", рукосуи.


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 960
Откуда: Киев
Всё-таки, важность 0 в позиционной системе счисления совсем несопоставима с важностью массива 0-й длины. Тут нет очевидной аналогии.


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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1202
PSV100 писал(а):
Не может быть нового "пустого кортежа", как и нового "пустого множества" и т.п. Таковы "математические объекты" единственны

"математические объекты" вроде кортежа (1, 3, 5) тоже единственны.


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

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Info21 писал(а):
Желание на первый взгляд странное
Да и не только на первый. Потому что, очевидно, кому-то нужен не массив а некая более высоко-уровневая "структура данных"


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

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


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

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 717
Откуда: Барнаул
Очевидно, что там и читать нечего.


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 372
Info21 писал(а):
Констатирую, что стремление к чистому надёжному коду описывается выражением "взыскуя научности".

Направьте эту иронию на цифру "0", рукосуи.

На всякий случай, выше ни грамма не было никакой иронии.


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 372
Trurl писал(а):
PSV100 писал(а):
Не может быть нового "пустого кортежа", как и нового "пустого множества" и т.п. Таковы "математические объекты" единственны

"математические объекты" вроде кортежа (1, 3, 5) тоже единственны.

Ключевое в том, что объекты вида (1, 3, 5) "порождаются", а "нейтральные" объекты вида "()" (аля мультипликативная единица) вводятся априори.


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

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


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

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


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

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