OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 21 Октябрь, 2019 05:13

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




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

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

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

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


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

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


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


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


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

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

Понятно.


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

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

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
Сообщения: 371
Александр Ильин писал(а):
В 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 в качестве массива нулевой длины, то никакого дескриптора у него не будет. Этот особый случай должен поддерживаться компилятором.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Четверг, 13 Июнь, 2019 18:46 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Посмотрел по диагонали тему. Нечего не понял. Во всех скриптовых языках массивы нулевой длины есть. Да и не только в скриптовых: https://play.golang.org/p/0DaDchNpauF

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

И да, я за свою практику тысячи раз писал if x.count() > 0 then ... - обычная ежедневная рутина.


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

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Цитата:
Нечего не понял

facepalm


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Массивы нулевой длины
СообщениеДобавлено: Пятница, 14 Июнь, 2019 21:57 

Зарегистрирован: Среда, 31 Январь, 2018 19:54
Сообщения: 129
Цитата:
ilovb писал: И да, я за свою практику тысячи раз писал if x.count() > 0 then ... - обычная ежедневная рутина.

А просто проверка на существование не спасает в вашем случае?


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

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

Речь шла primarily про Обероны.


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

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Цитата:
А просто проверка на существование не спасает в вашем случае?


Не понял.

Цитата:
Но увидел возможность повысить свою доминантность.


Конечно. Вы же пытаетесь повышать свою доминантность такими комментариями.

Только я склонен считать это не повышением моей доминантности (это я делаю иначе), а уравновешиванием сил и мнений.


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

Зарегистрирован: Среда, 31 Январь, 2018 19:54
Сообщения: 129
ilovb писал(а):
Цитата:
А просто проверка на существование не спасает в вашем случае?

Не понял.

В вашем примере: if x.count() > 0 then --> Если массив ещё не создан, получите ошибку.
Если замените на проверку - If "массив не существует" then --- ошибки не будет.
А все остальное уже потом ... при необходимости создаете массив или делаете что-то ещё ...
Александр Ильин писал(а):
если разрешить использовать nil в качестве массива нулевой длины, то никакого дескриптора у него не будет. Этот особый случай должен поддерживаться компилятором.

Очень интересно!
Массив нулевой длины - это как Чеширский кот - остались только одни глаза. Глаза Чеширского кота - это новая сущность - математическая абстракция - зачем плодить новые сущности без особой на то необходимости? На мой взгляд:
- Или нужен пример крайней необходимости таких массивов. На конференции в Орле или где-то ещё говорили, что Оберон единственный из других языков движется в сторону упрощения - тогда без примера крайней необходимости зачем?
- Или - если разработчики компиляторов скажут, что nil - как массив нулевой длины - это сделать "Просто" и не будет снижать надёжность и пр. проблем ....
но RESTRICT "массив нулевой длины" - нужно будет добавить )))


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

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Цитата:
В вашем примере: if x.count() > 0 then --> Если массив ещё не создан, получите ошибку.
Если замените на проверку - If "массив не существует" then --- ошибки не будет.
А все остальное уже потом ... при необходимости создаете массив или делаете что-то ещё ...


Зачем? Обычный динамический массив (aka List или Slice) именно эту работу и делает за тебя.
Под капотом там nil, а с точки зрения программиста пустой массив.

В Go кстати вообще и так и так можно: https://play.golang.org/p/8ZtyX6tTD8L

Т.е. в случае оберонов это типа можно невозбранно брать LEN от указателя на массив равного NIL.
Доработка кажется не сложная и вполне вменяемая.


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

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


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

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 341
arlean1 писал(а):
...
Очень интересно!
Массив нулевой длины - это как Чеширский кот - остались только одни глаза. Глаза Чеширского кота - это новая сущность - математическая абстракция - зачем плодить новые сущности без особой на то необходимости?...

Вроде ж выяснилось, что массив "не главное" (есть в нём данные, нет их...) - тэг массива (даже с нулевой длинной) будет всегда. (далее логично следует движение в сторону ассемблера ---> адрес тэга и доступ к его "полям" ;-) )


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

Зарегистрирован: Среда, 31 Январь, 2018 19:54
Сообщения: 129
Artyemov писал(а):
arlean1 писал(а):
...тэг массива (даже с нулевой длинной) будет всегда. (далее логично следует движение в сторону ассемблера ---> адрес тэга и доступ к его "полям" ;-) )

каким полям? Если быть последовательным -> вот пример для Go https://habr.com/ru/post/202948/
// Делаем копию среза (int).
slice3 := append([]int(nil), slice...)
fmt.Println("Copy a slice:", slice3)

Вот описание в GO через срезы - сравните пустой срез и Nil

Кроме того, используя новоприобретенные знания мы можем понять что из себя представляет «нулевой» (nil) срез. Естественно, это нулевое значение заголовок среза:
sliceHeader{
Length: 0,
Capacity: 0,
ZerothElement: nil,
}

или просто
sliceHeader{}

Ключевым является то, что указатель тоже равен nil. Данный срез
array[0:0]

имеет нулевую длину (и может даже нулевую ёмкость), но его указатель не nil, поэтому это все еще не нулевой срез.

Очевидно, что пустой срез может расти (предполагая что он не нулевой ёмкости), но «нулевой» (nil) срез не содержит массива, куда можно положить значения и не может вырасти, даже для того, чтобы содержать хоть один элемент.

Стоит отметить, что «нулевой» (nil) срез, по сути дела, эквивалентен срезу нулевой длины, даже если он ни на что не указывает. Он имеет нулевую длину и в него можно что-нибудь добавить с выделением. В качестве примера, посмотрите на несколько строчек выше, где копируется срез, добавляя «нулевой» (nil) срез.


Последний раз редактировалось arlean1 Воскресенье, 16 Июнь, 2019 21:10, всего редактировалось 1 раз.

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

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 341
arlean1 писал(а):
Artyemov писал(а):
arlean1 писал(а):
...тэг массива (даже с нулевой длинной) будет всегда. (далее логично следует движение в сторону ассемблера ---> адрес тэга и доступ к его "полям" ;-) )

каким полям?

Со сведениями о массиве; грязный хак подразумевался.
PS: при чём здесь го. В теме речь шла про обероны и компонентный паскаль.


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

Зарегистрирован: Среда, 31 Январь, 2018 19:54
Сообщения: 129
Artyemov писал(а):
Со сведениями о массиве; грязный хак подразумевался.
PS: при чём здесь го. В теме речь шла про обероны и компонентный паскаль.

Go ни при чём - это был пример реализации. Раньше для С++ такого примера не нашли - пусть хоть что-то будет осмысленное - даже срезы Go ... хочется понять смысл нововведения - начиналось ведь с этого:
arlean1 писал(а):
Массив нулевой длины - это как Чеширский кот - остались только одни глаза. Глаза Чеширского кота - это новая сущность - математическая абстракция - зачем плодить новые сущности без особой на то необходимости?


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

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Цитата:
Раньше для С++ такого примера не нашли


Не шарю в плюсах, но разве вектор нельзя создать с нулевой длиной?


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

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1411
ilovb писал(а):
Цитата:
Раньше для С++ такого примера не нашли
Не шарю в плюсах, но разве вектор нельзя создать с нулевой длиной?
Конечно можно.
Там для этого и существует два поля "про длину": одно - собсна "длина" - сколько элементов в векторе наличествует, и - "потенция" - сколько можно туда поместить без необходимости "удлинения" места хранения элементов. :)


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

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1133
Откуда: СССР v2.0 rc 1
Имхо, правильно считать, что если есть МАССИВ -- значит под него выделена ПАМЯТЬ. И в таком случае, на массив нулевой длинны указатель НЕ МОЖЕТ быть nill.
Даже если массив не содержит элементов -- у него есть тип, базовые методы обработки и состояние. У nill, например -- НЕ МОЖЕТ быть длины, или адреса в памяти (через указатель). Потому что он nill.


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

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


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

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


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

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