OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 19:26

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




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

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

Практическая полезность имеет тут место быть примерно по той же причине, что и в случае цифры нуль, хотя и не в таком масштабе.

Несколько раз возникало желание, чтобы были возможны массивы нулевой длины, -- как раз такой "нулевой случай".

Желание на первый взгляд странное, но возражения против него подобны простодушному возражению против нуля: зачем иметь обозначение для отсутствия подсчитываемых предметов ))

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

Кстати, вопрос можно было бы пустить по линии верификации программ.

PS
На вопрос повлиял свежий коммент С.Волкова о том, что он работает с Обероном, взыскуя научности ))


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
С научной точки зрения - все правильно.
Вопросы - в реализации.
Статический массив нулевой длины должен иметь какой-то адрес.
Проверка индексов, на мой взгляд, очевидно, для такого массива должна быть при компиляции.

Динамический массив - тоже должен иметь какой-то адрес.
И замечу, что все динамические массивы нулевой длины должны иметь РАЗНЫЕ адреса.
Проверка индекса такого для массива возможна ТОЛЬКО во время компиляции.

Недавно в одной лабе на С++ пацан сделал массив нулевой длины.
С++ это теоретически разрешает.
В лабе требовалось добавлять по 1 элементу в массив.
Вот он создает массив нулевой длины, передает его в качестве параметра в функцию.
Функция делает новый массив размером +1, переписывает туда переданный массив и последним размещает новый элемент.
Адрес нового массива возвращается из функции.
Прога не работала. Я смотрел адреса.
С++ нулевым массивам присваивал адреса, которые вызывают access violation.
Посоветовал пацану не выпендриваться, прочитать стандарт - может быть, там undifined behavior возникает?
Но пацану было читать лень, он просто стал создавать массив ненулевой длины... :)


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

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

И статической проверки компилятором в этом случае быть не может. См. какой-нибудь цикл по массиву, передаваемому в качестве VAR параметра.

Весь смысл здесь в том, чтобы код не зависел от длины массива, в том числе в случае нуля.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Поддерживаю. Конечно, это обретает смысл в условиях параметров - открытых массивов. В С непонятно, нафига козе баян )

В КП, кстати, я не вижу проблем к этому.

У динамических массивов в их заголовке блока может стоять длина 0, корректно работало (создать нельзя нулевой длины, потом поставить можно - мы делали SetLength для дин. массивов - который многие на этом форуме используют - и там допускается и 0).

С открытыми массивами - тоже почти всё ОК с приёмом нуля (почему почти - скажу дальше).

Вот пример:
Код:
MODULE Krl_devLangArr0;
   IMPORT SYSTEM, StdLog;

   PROCEDURE P (VAR x: ARRAY OF INTEGER);
      VAR i: INTEGER;
   BEGIN
      StdLog.Int(LEN(x));
      i := 0;
      x[i] := 1
   END P;

   PROCEDURE Do*;
      VAR x: ARRAY 1 OF INTEGER;
   BEGIN
      P(SYSTEM.THISARRAY(SYSTEM.ADR(x[0]), 0));
   END Do;
   
END Krl_devLangArr0.



Всё корректно. В лог печатается 0, защита границ срабатывает, в окне трэпа виден массив нулевого размера:
Вложение:
Снимок экрана от 2019-04-05 10-16-33.png
Снимок экрана от 2019-04-05 10-16-33.png [ 11.42 КБ | Просмотров: 8077 ]


КосяГ проявляется, если обращаться к массиву по константному индексу:

Код:
   PROCEDURE P (VAR x: ARRAY OF INTEGER);
      VAR i: INTEGER;
   BEGIN
      StdLog.Int(LEN(x));
      x[0] := 1
   END P;


На x[0] - пропускает почему-то. На x[1] - уже нет, трэпует.
Кто спинным мозгом ассемблер курит, может помозговать.

Вот декодер для
BEGIN x[0] := 1 END P:

Вложение:
Снимок экрана от 2019-04-05 10-21-32.png
Снимок экрана от 2019-04-05 10-21-32.png [ 13.05 КБ | Просмотров: 8078 ]


А вот для BEGIN i := 0; x[i] := 1; END P:

Вложение:
Снимок экрана от 2019-04-05 10-23-37.png
Снимок экрана от 2019-04-05 10-23-37.png [ 18.32 КБ | Просмотров: 8077 ]


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1447
Откуда: Киев
Info21 писал(а):
Предположим, что определение языка ослабляется так, чтобы разрешить массивы нулевой длины.
Впечатление, что это никак не повлияет на существующий софт -- или я чего-то не вижу?
Согласен, что массив 0-й длины может быть полезен, но его введение всё-таки может повлиять на тот код, который безусловно обращается к 0-му элементу массива исходя из того, что длина массива > 0.

Валерий Лаптев писал(а):
Статический массив нулевой длины должен иметь какой-то адрес
...
Динамический массив - тоже должен иметь какой-то адрес.
И замечу, что все динамические массивы нулевой длины должны иметь РАЗНЫЕ адреса.
Поскольку речь не о Си, то адреса отличные от 0 не нужны. Если всё же нужны, то для чего?


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

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
Есть еще код типа a[LEN(a)-1] := 0X. Да и вообще, ни одна процедура из Strings не выдержит массива нулевой длины.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну, де факто массив символов как массив символов и массив символов как строка и так представляют собой два разных семантических типа в КП.

Т.е. глядя на нечто, что объявлено как ARRAY OF CHAR, мы должны получить откуда-то дополнительную информацию, по какому соглашению используется этот ARRAY OF CHAR.
Можем ли мы применить к нему строковые операции, не получив выход за его границы.


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

Зарегистрирован: Пятница, 13 Март, 2015 16:40
Сообщения: 597
Илья Ермаков писал(а):
Т.е. глядя на нечто, что объявлено как ARRAY OF CHAR...

Максимально допустимая длина?


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

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

Поэтому и правильно, что не выдержат.

Но пустые strings они как раз, если не ошибаюсь, выдерживают.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Artyemov писал(а):
Илья Ермаков писал(а):
Т.е. глядя на нечто, что объявлено как ARRAY OF CHAR...

Максимально допустимая длина?


Имею в виду параметр - открытый массив.

Про "можем ли применить строковые операции":
- применение $ или + к произвольному ARRAY OF CHAR чревато непредсказуемым поведением (если там не строка, то как повезёт с наличием нуля);
- т.е. семантика конкретного ARRAY OF CHAR зависит от того, как он использован (под строку или не под строку).


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

Зарегистрирован: Среда, 31 Январь, 2018 19:54
Сообщения: 244
В 2004 г. это оценивалось так:
Цитата:
Okay, you may say, then why not use a zero-length array instead
of a 1-length array?
Because time travel has yet to be perfected.

Раймонд Чен https://devblogs.microsoft.com/oldnewthing/?p=38043


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

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

так же, как нуль даёт возможность "регуляризовать" алгоритмы арифметики,

так же, как цикл why оказывается в целом самым удобным ровно потому, что допускает повторение нуль раз,

так же, как рекурсивные процедуры, обрабатывающие "нулевой случай", приводят к более компактным и ясным программам, чем в противном случае,

-- совершенно в той же струе лежат наблюдавшиеся ситуации, где допущение массивов нулевой длины "регуляризовало" бы код.

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


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
В С++ мы просто работаем с контейнером vector - он это, естественно, позволяет.
Я уж и забыл, когда последний раз работал со встроенными массивами.
Может быть, просто стоит реализовать подобный контейнер?


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

Зарегистрирован: Вторник, 27 Февраль, 2018 09:18
Сообщения: 73
Валерий Лаптев писал(а):
В С++ мы просто работаем с контейнером vector - он это, естественно, позволяет.
Я уж и забыл, когда последний раз работал со встроенными массивами.
Может быть, просто стоит реализовать подобный контейнер?

Ни в коем случае. Массивы нулевой длины это угроза надёжности языка.
Вот, например, такие массивы возможны в Java, и сами видите где этот язык сейчас.


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

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Info21 писал(а):
arlean1 писал(а):
В 2004 г. это оценивалось так:
Ещё раз:

так же, как нуль даёт возможность "регуляризовать" алгоритмы арифметики,

так же, как цикл why оказывается в целом самым удобным ровно потому, что допускает повторение нуль раз,

так же, как рекурсивные процедуры, обрабатывающие "нулевой случай", приводят к более компактным и ясным программам, чем в противном случае,

-- совершенно в той же струе лежат наблюдавшиеся ситуации, где допущение массивов нулевой длины "регуляризовало" бы код.

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

Нулевой случай не всегда должен обрабатываться как нормальный случай. Разыменовывать нулевой указатель нельзя. Приводить нулевой указатель к другому типу (по крайней мере в Oberon-07) нельзя. Делить на нуль нельзя :)

Если будут массивы нулевой длины, то к ним нельзя будет обращаться через оператор обращения к элементу массива [] ни с каким значением. То есть по сути оператор [] для них будет запрещен. Получается, что ко всем массивам можно будет обращаться по оператору [] (в заданных пределах, чтобы не выйти за границы массива), а к операторам с нулевой длиной нельзя.

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

P.S. В книге Вирта читал про поиск с барьером, когда, пишут не:
Код:
i := 0;
WHILE (i < Number) & (array[i] # searchingValue) DO
  i := i + 1;
END;

а пишут:
Код:
array[Number] := searchingValue;
i := 0;
WHILE array[i] # searchingValue DO
  i := i + 1;
END;

При этом необходимо чтобы массив был на 1 элемент больше, чем требуется хранить элементов.
И по аналогии с этим Вы всегда можете использовать массивы на 1 элемент больше и тогда массивом нулевой длины будет реальный массив из 1 элемента.


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

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
Владимир Ситников писал(а):
Ни в коем случае. Массивы нулевой длины это угроза надёжности языка.
Вот, например, такие массивы возможны в Java, и сами видите где этот язык сейчас.
Где можно почитать про проблемы в Java, связанные с массивами нулевой длины?
И речь вообще-то Валерий завёл об обобщённых контейнерах, которые теоретик Компонентного Паскаля Шиперский предложил, но они так и остались нереализованными.


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Rifat писал(а):
При этом необходимо чтобы массив был на 1 элемент больше, чем требуется хранить элементов.
И по аналогии с этим Вы всегда можете использовать массивы на 1 элемент больше и тогда массивом нулевой длины будет реальный массив из 1 элемента.

В С++ в контейнерах просто есть некий фиктивный элемент после последнего элемента, который нужен для легализации итератора end.
Я об этом довольно подробно разъяснял в своей книжке... :)

Если в Обероне сделать такой же контейнер с невидимым фиктивным элементом, то должно все получиться.
Кстати, для пустого вектора попытка обратиться по индексу заканчивается аварийно.
Это - нормальное поведение.
Но зачем тащить в язык, если можно реализовать в библиотеке?


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
Валерий Лаптев писал(а):
...
Недавно в одной лабе на С++ пацан сделал массив нулевой длины.
С++ это теоретически разрешает.
В лабе требовалось добавлять по 1 элементу в массив.
Вот он создает массив нулевой длины, передает его в качестве параметра в функцию.
Функция делает новый массив размером +1, переписывает туда переданный массив и последним размещает новый элемент.
Адрес нового массива возвращается из функции.
Прога не работала. Я смотрел адреса.
С++ нулевым массивам присваивал адреса, которые вызывают access violation.
...

Скорее, C++ автоматически не выделяет память и не присваивает адреса нулевым массивам. В противном случае теряется смысл как таковой их применения. Если необходимо выделение памяти, то таково осуществляется для внешних по отношению к массиву объектов (явные указатели на массив или структуру, его содержащую, и т.п.). См., например (плюс там комментарии к ответу):
https://ru.stackoverflow.com/questions/297649/%D0%9C%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D1%8B-%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9-%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B#


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
Валерий Лаптев писал(а):
В С++ мы просто работаем с контейнером vector - он это, естественно, позволяет.
Я уж и забыл, когда последний раз работал со встроенными массивами.
Может быть, просто стоит реализовать подобный контейнер?
[...]
Но зачем тащить в язык, если можно реализовать в библиотеке?

Всё же, первично то, что язык должен позволять реализовывать библиотеки. Вряд ли какой-то единственный vector может оказаться предельно общим, т.е. единственным решением для всех случаев в универсальном ЯВУ (если всё же эффективность не игнорировать). К примеру, если понадобится контейнер как "вектор векторов" (таблица), то некий стандартный vector может не удовлетворить потребности. Использование структур/записей в качестве хранимых элементов (строка таблицы) вектора/динамического массива может оказаться нерациональным для распределения памяти, неэффективным для применения определенных политик доступа. К тому же возможно определение структур только в runtime (состав столбцов задаётся динамически во время выполнения программы). Или же необходимо организовать постраничное управление памятью и т.д.
В итоге, необходимы разные реализации всякого разного, и реализации эффективные. Соответственно, и язык должен способствовать. Не в курсе, как такие вопросы решаемы в Оберон-е, ещё и во взаимодействии с мусорщиком (к слову, те же хаки над статическими массивами нулевой длины хоть как-то упрощают жизнь).


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

Зарегистрирован: Понедельник, 25 Июнь, 2012 17:26
Сообщения: 473
Info21 писал(а):
Ещё раз:

так же, как нуль даёт возможность "регуляризовать" алгоритмы арифметики,

так же, как цикл why оказывается в целом самым удобным ровно потому, что допускает повторение нуль раз,

так же, как рекурсивные процедуры, обрабатывающие "нулевой случай", приводят к более компактным и ясным программам, чем в противном случае,

-- совершенно в той же струе лежат наблюдавшиеся ситуации, где допущение массивов нулевой длины "регуляризовало" бы код.

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

Валерий Лаптев писал(а):
С научной точки зрения - все правильно.
Вопросы - в реализации.
Статический массив нулевой длины должен иметь какой-то адрес.
Проверка индексов, на мой взгляд, очевидно, для такого массива должна быть при компиляции.
...

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

Кстати, в основных императивных языках программирования по историческим причинам в итоге получился какой-то казус в массивах. Использовать формы декларации динамических/открытых массивов не получится в тех случаях, когда применяют статические массивы (а точнее -- псевдомассивы) нулевой длины (не должно быть никаких скрытых структур-дескрипторов, содержащих длину и прочие возможные метаданные и т.п., контекст управления условными метаданными находится вовне таких объектов). Ведь, что Си-шная форма аля:
my_data_t data[0]

, что ещё более загадочная FreePascal/Delphi-форма аля:
data: array[0..0] of TMyData

по сути "с научной точки зрения" некорректны. Указание нуля для измерения массива есть декларация отсутствия этого измерения. Нуль-мерный массив по определению есть скаляр (фактически, не есть массив).
Илья Ермаков писал(а):
У динамических массивов в их заголовке блока может стоять длина 0, корректно работало (создать нельзя нулевой длины, потом поставить можно - мы делали SetLength для дин. массивов - который многие на этом форуме используют - и там допускается и 0).

Видимо, может быть и были какие-то идеологические заморочки с тем, что нельзя создавать массив нулевой длины через new. Мол нельзя задать нуль-мерный массив (или "отменить" (т.е. не указать) какое-то измерение из возможных). А установка длины для одномерного массива-вектора (иными словами, с уже предварительно определенным/введённым измерением, т.е. абстрактный "программистский" массив с неопределенными измерениями до new "превратился" в вектор после new) есть мол декларация нуль-вектора (хотя, скорее, хрень какая-то в итоге).

Со стороны "математической научности" показательны языки ML-семейства, где массивы выражаются через форму степени. Массив как кортеж, например, из трёх элементов типа "a" структурно задаётся через произведение (логическое "и"): "a * a * a", что эквивалентно: "a^3". Если указать нулевую степень (для любого типа), то "по-научному" уже нет никакого массива и возникает универсальный тип unit (единица), что эквивалентно пустым скобкам "()". Аналогично введены пустые скобки для списков "[]", для векторов "[| |]" и пр. Именно такие "пустые" константные объекты (с возможностью сопоставления объектов с ними) соответствуют "научным" выражениям пустого множества, нуль-вектора и т.д. (где-то возможны непосредственно юникод-символы пустого множества и пр.).
Видимо, всё-таки, в рамках вопросов реализации для поддержки "научной точки зрения" желательны константные выражения для массивов, где пустая форма аля "[]" задаёт частный случай нуль-вектора в явном виде.

А реализация в языке "правильных" динамических массивов, которые не содержат ничего лишнего, не требуют никакой памяти при нулевых размерах, и нет никаких скрытых вспомогательных структур, плюс контроль доступа (отключаемый при необходимости) со стороны компилятора -- вопрос непростой, однако. Видимо, нужны техники аля "регионов" в стиле некоторых ML-диалектов (и некоторых приёмов из Rust, пришедших из ML), может быть потребуются аля "дискриминанты" записей как в Ada, и пр. Путь не для Оберонов, видимо.


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

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


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

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


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

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