OberonCore
https://forum.oberoncore.ru/

Массивы нулевой длины
https://forum.oberoncore.ru/viewtopic.php?f=27&t=6374
Страница 4 из 5

Автор:  Info21 [ Воскресенье, 21 Апрель, 2019 23:58 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Удивлён.

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

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

Автор:  Александр Ильин [ Понедельник, 22 Апрель, 2019 19:43 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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


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


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

Автор:  Info21 [ Понедельник, 22 Апрель, 2019 22:47 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Если ... то ... должен ...

Понятно.

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

Александр Ильин писал(а):
Идея выделить память, но иметь в ней ноль элементов, - несколько экстравагантная, на мой взгляд.

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, позволяют избегать выделений в куче для пустых динамических массивов.

Автор:  PSV100 [ Вторник, 23 Апрель, 2019 19:23 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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

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

Автор:  ilovb [ Четверг, 13 Июнь, 2019 18:46 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Посмотрел по диагонали тему. Нечего не понял. Во всех скриптовых языках массивы нулевой длины есть. Да и не только в скриптовых: https://play.golang.org/p/0DaDchNpauF

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

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

Автор:  ilovb [ Пятница, 14 Июнь, 2019 09:46 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Цитата:
Нечего не понял

facepalm

Автор:  arlean1 [ Пятница, 14 Июнь, 2019 21:57 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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

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

Автор:  Info21 [ Суббота, 15 Июнь, 2019 00:04 ]
Заголовок сообщения:  Re: Массивы нулевой длины

ilovb писал(а):
Посмотрел по диагонали тему. Нечего не понял.
Но увидел возможность повысить свою доминантность.

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

Автор:  ilovb [ Суббота, 15 Июнь, 2019 01:41 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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


Не понял.

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


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

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

Автор:  arlean1 [ Суббота, 15 Июнь, 2019 08:18 ]
Заголовок сообщения:  Re: Массивы нулевой длины

ilovb писал(а):
Цитата:
А просто проверка на существование не спасает в вашем случае?

Не понял.

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

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

Автор:  ilovb [ Суббота, 15 Июнь, 2019 12:36 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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


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

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

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

Автор:  Info21 [ Суббота, 15 Июнь, 2019 13:35 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Цитата:
Цитата:
Но увидел возможность повысить свою доминантность.
Конечно. Вы же пытаетесь повышать свою доминантность такими комментариями.
Нет, я пытался вернуть Вас к исходной теме. Что мне удалось.

Автор:  Artyemov [ Воскресенье, 16 Июнь, 2019 16:47 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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

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

Автор:  arlean1 [ Воскресенье, 16 Июнь, 2019 20:53 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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) срез.

Автор:  Artyemov [ Воскресенье, 16 Июнь, 2019 21:10 ]
Заголовок сообщения:  Re: Массивы нулевой длины

arlean1 писал(а):
Artyemov писал(а):
arlean1 писал(а):
...тэг массива (даже с нулевой длинной) будет всегда. (далее логично следует движение в сторону ассемблера ---> адрес тэга и доступ к его "полям" ;-) )

каким полям?

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

Автор:  arlean1 [ Воскресенье, 16 Июнь, 2019 21:36 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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

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

Автор:  ilovb [ Понедельник, 17 Июнь, 2019 14:07 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Цитата:
Раньше для С++ такого примера не нашли


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

Автор:  Wlad [ Понедельник, 17 Июнь, 2019 14:27 ]
Заголовок сообщения:  Re: Массивы нулевой длины

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

Автор:  prospero78 [ Пятница, 04 Октябрь, 2019 19:13 ]
Заголовок сообщения:  Re: Массивы нулевой длины

Имхо, правильно считать, что если есть МАССИВ -- значит под него выделена ПАМЯТЬ. И в таком случае, на массив нулевой длинны указатель НЕ МОЖЕТ быть nill.
Даже если массив не содержит элементов -- у него есть тип, базовые методы обработки и состояние. У nill, например -- НЕ МОЖЕТ быть длины, или адреса в памяти (через указатель). Потому что он nill.

Страница 4 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/