OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 96 ]  На страницу Пред.  1, 2, 3, 4, 5
Автор Сообщение
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Четверг, 21 Май, 2020 11:13 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Нашел мнение Дейкстры по данному поводу EWD662.
Цитата:
The three quoted sentences strongly suggest to me that the YELLOW Language requires that in the array declaration the low bound for each index does not exceed its high bound, and hence it is impossible to declare an empty array! (This interpretation is subject to doubt. On the one hand we find the quoted error among those "a compiler for our language must detect" and it is not mentioned under the sample of traps and exceptions "for which compiled code and runtime systems must provide" (p.L-116); on the other hand the text refers to "Arrays whose index ranges are determined only on entry to the scope of their declaration (p.F-12).)

Now the exclusion of the empty array is absolutely silly. One of the great improvements of ALGOL 60 over FORTRAN at that time was that in FORTRAN's DO loop the repeatable statement had to be executed at least once, whereas in ALGOL 60's for statement zero executions of the repeatable statement was permissible. ALGOL 60 failed to introduce the same generality for arrays, but I find it unbelievable to see that 18 years later that same mistake is still fairly faithfully, and to see the empty set —500 years after the introduction of the digit zero in the Western world— still treated as a second class citizen. (For the pragmatists who are insensitive to the verdict of mathematical immaturity: to allow the empty array as well would have simplified the language and its implementation, as it would have reduced the number of error messages by one.)


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Info21 писал(а):
Несколько раз возникало желание, чтобы были возможны массивы нулевой длины, -- как раз такой "нулевой случай".

Разделяю. И с практической, и с теоретической т.зр. Интересно бы узнать соображения Вирта по этому вопросу...

Info21 писал(а):
Предположим, что определение языка ослабляется так, чтобы разрешить массивы нулевой длины.
Впечатление, что это никак не повлияет на существующий софт -- или я чего-то не вижу?


Перечитал Сообщение о языке КП, разделы 6.2, 6.4 10.3 - и не нашел там, что ослаблять. Выходит, вроде как в КП и ослаблять нечего, нулевая длина разрешена... И нынешняя реализация не вполне соответствует Сообщению. :shock:

Info21 писал(а):
Все существующие пакеты имеют подразумеваемое предусловие LEN()>0.
Передавать иное -- ошибка того, кто передаёт.
Обращения к элементам out of range защищены дважды: в коде и в проверках, встроенных компилятором.

Что пропущено?


В моем лично коде могут возникнуть трудности в случае открытых массивов - параметров:

PROCEDURE P ([IN/VAR] a: ARRAY OF T);

Вот в такой процедуре я всегда рассуждал "к a[0] можно обращаться без проверок". И, видимо, был не прав. Но это редкость, конечно - чаще вставляется универсальная проверка с LEN(a).

Info21, а вы просто порассуждать хотели на эту тему, или у вас есть некие предложения?


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
adimetrius писал(а):
Info21, а вы просто порассуждать хотели на эту тему, или у вас есть некие предложения?
"просто порассуждать" у меня сил нет ))

Просто несколько раз я сталкивался с тем, что требуется особый код для компенсации отсутствия нулевого варианта.
При этом сам всегда учу проектировать процедуры так, чтобы они обрабатывали нулевой случай -- потому что это действительно простое логическое обобщение числового нуля.

В общем, соображения логической чистоты, подкрепленные некой практикой. К сожалению, примера привести не смогу, т.к. соображение мелькает на заднем плане, не находя пути практического воплощения.

Но всё-таки мысль намозолилась, чтобы однажды воплотиться в первую запись этой ветки ))

А предложение простое -- разрешить массивы нулевой длины.


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Ну, Боб Мартин по этому поводу написал главу Null Object.
Если создавать новый тип, то "нулевое" значение должно быть описано.
Может быть, создать некий модуль, в котором описать массив с полем-количеством элементов.
И соответственно, для работы с массивами его использовать.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Валерий Лаптев писал(а):
Ну, Боб Мартин по этому поводу написал главу Null Object.
Целую главу??


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Валерий Лаптев писал(а):
Если создавать новый тип, то "нулевое" значение должно быть описано.

А чем плох LEN(a) = 0? И не нужны новые сущности
Код:
VAR a: ARRAY OF ARRAY OF ARRAY N OF T;
...
i := 0; WHILE i < LEN(a, 0) DO
  IF LEN(a, 1) = 0 THEN ... ELSE ... END;
  INC(i)
END;

Поскольку в КП нет массивов-литералов вообще, то и не нужен особый литерал для пустого массива, типа NULL, NIL или [].


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Пятница, 22 Май, 2020 08:54 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
1. В книге: Принципы, паттерны и методики гибкой разработки на С#.
Глава 25. Null-объект.
Небольшая, но отдельная глава - подчеркивается важность темы.
У него там запрос к БД. И вопрос: а если данных по запросу не существует ?
И он рисует паттерн Null-объект.

2. Len() - это сколько элементов выделено.
А количество элементов - это сколько там реально элементов.
В stl len() = capacity()
а количество элементов = size()

Мы можем мерить размер массива именно количеством элементов в нем.
Тогда 0 элементов - это и будет массив нулевой длины.

Естественно, надо писать модуль (и/или класс), в котором такая идеология будет реализована.

3. В С++ массивы нулевой длины есть, но для повседневной практики они никогда не применяются, ибо бесполезны.
Массив не имеет методов проверки количества элементов
А вот реализованные в stl контейнеры с проверками size() == 0 - повсеместно.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Вот и топить всех в Байкале...


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Кстати, я на Байкале еще не был. И на "Байкале" пока не работал
:lol: :lol: :lol:


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Info21 писал(а):
Вот и топить всех в Байкале...


Не, так нельзя, нужно беречь Байкал!


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Валерий Лаптев писал(а):
2. Len() - это сколько элементов выделено.
А количество элементов - это сколько там реально элементов.

Как будто в России язык разрабатывали: выделено столько-то, а реально столько-то. Шучу.

КП разрабатывали в Швейцарии, старались, как попроще, поэтому есть у массива один параметр: длина. Определяется LEN(). И я настаиваю, что они никакие не динамические: если a: ARRAY, LEN(a, N) - это константа. Даже когда p: POINTER TO ARRAY OF T, обращение NEW(p, 16) создает (безымянную) переменную типа ARRAY 16 OF T - массив фиксированного размера; следующий NEW(a, 32) создает другую переменную типа ARRAY 32 OF T - тоже фиксированного. Ничего в динамике не меняется.


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
А вот use case.

PROCEDURE P (IN p: ARRAY OF T); (* P не может получить нулевой массив *)
BEGIN
len := LEN(p)
END P;

PROCEDURE Q (p: POINTER TO ARRAY OF T); (* Q тоже не может получить нулевой массив, но может получить NIL как синоним нулевого массива *)
BEGIN
IF p # NIL THEN len := 0 ELSE LEN := LEN(p) END
END Q;

При этом в нынешней реализации КП в ББ обращение к открытому массиву в P существенно эффективнее реализовано, чем в Q.

PROCEDURE R;
VAR p: POINTER TO ARRAY OF T;
BEGIN
P(p); (* разыменование, NIL Не пройдет. А хотелось бы... *)
Q(p)
END R;

А хотелось бы, в этом конкретном примере, чтобы p = NIL разыменовывалось в ARRAY 0 OF T.
-----------
ПС Коллеги, это мысли вслух, а не конкретное предложение.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
adimetrius писал(а):
Info21 писал(а):
Вот и топить всех в Байкале...


Не, так нельзя, нужно беречь Байкал!
Байкал их не заметит.

Задачка на тему REAL: если всех людей мира утопить в Байкале, на сколько повысится его уровень? Сначала обязательно попытаться угадать -- метр? десять? сто?


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

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Любопытно, вышло 10м, или 1% его средней глубины. И правда, не заметит. Хотя я поставил на 100.
Только надо уточнить: это если все отверстия закупорить, и внутрь вода не попадет. Иначе на 10% меньше.
Ну, если не Байкал, то хоть людей поберечь. Можно, напр, их рукописи топить, раз уж они не горят.
А при чем здесь REAL?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Пятница, 22 Май, 2020 16:58 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 710
Откуда: Псков
А у меня при 10 млрд народу по 100литров в каждом вышло всего ~3см
Забавно то, что если бы байкал был глубиной по колено, эффект был бы тот же.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Ну, народу всё-таки меньше 10 миллиардов, и средний их объём меньше 100 л. (100 кг) -- много детей и худышек, причём в самой населённой части -- Азии.

А так по-грубому правильно -- маленькое количество сантиметров ))

REAL -- потому что большие числа (тренаж записи миллиардов и проч.) + деление.


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

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


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

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


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

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