OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 24 Январь, 2019 15:36

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




Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 19:24 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 571
Откуда: Россия, Санкт-Петербург
И всё-таки мы ушли от темы.
Вот сейчас мне нужно иметь матрицы преобразований (поворота) типа
Код:
Move: ARRAY 4, 4 OF REAL =
  [[ 1,  0,  0,  0],
   [ 0,  1,  0,  0],
   [ 0,  0,  1,  0]
   [dx, dy, dz, 1]];

и что же их тоже хранить в отдельном файле ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 19:41 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Valery Solovey писал(а):
Что Вы подразумеваете под форматированием? Если Вы где-то в тексте поставили (или не поставили) возврат каретки, то это тоже фроматирование.
Возврат каретки, перевод строки, символ табуляции и смена регистра букв я не считаю форматированием, а курсив, bold, смена шрифта по среди текста и такое прочее -- это форматирование.
Valery Solovey писал(а):
Форматирование средствами КП трудоёмко как для человека, составляющего меню, так и для каркаса, читающего его время от времени.
А кому сейчас легко? :) Если серьёзно, то задача не особенно трудна, если Вы умеете строить распознающие автоматы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 19:52 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Madzi писал(а):
И всё-таки мы ушли от темы.
Вот сейчас мне нужно иметь матрицы преобразований (поворота) типа
...
и что же их тоже хранить в отдельном файле ?
Если я Вас правильно понял, эти матрицы пригодны для большого круга графических задач, и не планируется активно менять их в будущем. В этом случае, лучше записать поэлементное присваивание, и поместить код в библиотеку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 20:28 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 975
Откуда: Украина, Киев
Madzi писал(а):
Вот сейчас мне нужно иметь матрицы преобразований (поворота)
Ведь все они образуются на базе единичной матрицы. Следовательно, в модуле объявляется единичная матрица, в секции BEGIN она инициализируется. А далее определяются процедуры-конструкторы которые создают нужную матрицу беря за основу единичную, и подставляя изменяемые параметры. Чем не устраивает такой вариант?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 20:49 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Игорь Лоскутов писал(а):
Правильно, на некотором формальном языке. И раз мне приходится его знать и применять для того, чтобы получить работоспособную программу, то его можно рассматривать как расширение основного языка.
Я бы назвал это языком описания меню. И его не обязательно знать чтобы получить работоспособную программу. Этот язык надо знать, если Вы хотите настроить меню ББ.
Игорь Лоскутов писал(а):
То есть форматирование может быть, но оно должно быть (ИМХО) встроено в редактор кода, а не в саму текстовую модель.
Если Вы работаете в ББ, то текстовая модель -- это (хотите Вы этого или нет :) ):
Цитата:
Модуль TextModels определяет текстовые модели, которые являются моделями-контейнерами и содержат форматированный текст, в который могут быть внедрены произвольные отображения.

Не забывайте, что Вы работаете в компонентной среде!
- есть текст -- текстовая модель. Она может хранить "....". Ей глубоко до балды, что это за текст: документация, исходный, описание меню и т.д. и т.п. Есть текстовое отображение, которое позволяет смотреть и редактировать содержимое текстовой модели. Это не специализированный редактор кода/ресурсов/меню. Это просто редактор (текстовой модели).
- есть построитель меню. Он использует текст, чтобы извлечь из него описание меню. Форматирование для него роли не играет.
- есть компилятор. Он использует текст, чтобы считать из него текст модуля. Форматирование для него роли не играет.
....
Это независимые друг от друга компоненты. Чтобы пользоваться какой-то из них, Вам нужно знать именно её. Знание других не требуется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 21:03 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Игорь Лоскутов писал(а):
Madzi писал(а):
...и что же их тоже хранить в отдельном файле ?
В этом случае, лучше записать поэлементное присваивание, и поместить код в библиотеку.
В подсистеме Ogl, например, так и делают.
Код:
PROCEDURE  Set4f (OUT a: ARRAY OF GL.Float;  a0, a1, a2, a3: REAL);
BEGIN
   a[0] := SHORT(a0);  a[1] := SHORT(a1); 
   a[2] := SHORT(a2);  a[3] := SHORT(a3)
END Set4f;

Кстати можно завести единичную матрицу:
Код:
move := e; move[3,0] := dx; ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 00:07 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 571
Откуда: Россия, Санкт-Петербург
Я конечно рад за другие системы, но хотелось бы иметь статические матрицы поворота (по 5 градусов на каждую ось), а приходится делать так:
Код:
PROCEDURE RotateX(alpha: REAL): Matrix3d;
VAR
  m: Matrix3d;
BEGIN
  m[0, 0] := 1; m[0, 1] :=   0;                     m[0, 2] := 0;
  m[1, 0] := 0; m[1, 1] :=   Math.cos(alpha); m[1, 2] := Math.sin(alpha);
  m[2, 0] := 0; m[2, 1] :=  -Math.sin(alpha);  m[2, 2] := Math.cos(alpha);
  RETURN m
END RotateX;


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9072
Откуда: Россия, Орёл
А какая для Вас разница между константами и переменными, экспортированными только для чтения, которые при загрузке модуля будут инициализированы нужными значениями?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 00:28 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 571
Откуда: Россия, Санкт-Петербург
Илья Ермаков писал(а):
А какая для Вас разница между константами и переменными, экспортированными только для чтения, которые при загрузке модуля будут инициализированы нужными значениями?

Разница в наглядности.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9072
Откуда: Россия, Орёл
Да ну...
Вынесите в отдельный модуль группу таких "констант" - и всего-то делов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 09:42 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 975
Откуда: Украина, Киев
Madzi писал(а):
Я конечно рад за другие системы, но хотелось бы иметь статические матрицы поворота (по 5 градусов на каждую ось), а приходится делать так:
Почему нельзя сделать так?
Код:
MODULE Matrices; (** AUTHOR ""; PURPOSE ""; *)

IMPORT
   Math;
   
TYPE
   Matrix3d* = ARRAY 3, 3 OF REAL;
   
VAR
   Identity-: Matrix3d;
   RotateX5-: Matrix3d;
   
PROCEDURE RotateX*(alpha: REAL): Matrix3d;
VAR
  m: Matrix3d;
BEGIN
   m := Identity;
   m[1, 1] :=   Math.cos(alpha); m[1, 2] := Math.sin(alpha);
   m[2, 1] :=  -Math.sin(alpha);  m[2, 2] := Math.cos(alpha);
   RETURN m
END RotateX;

PROCEDURE Init;
VAR
   i, j: SHORTINT;
BEGIN
   (* Identity matrix init *)
   FOR j := 0 TO 2 DO
      FOR i := 0 TO 2 DO
         IF i = j THEN
            Identity[i, j] := 1
         ELSE
            Identity[i, j] := 0
         END
      END
   END;
   RotateX5 := RotateX(5 * Math.pi / 180)
END Init;

BEGIN
   Init;
END Matrices.
Как иначе Вы предпологаете, что-бы компилятор вычислил значения Math.cos(5 * Math.pi / 180) и Math.sin(5 * Math.pi / 180)? Ведь для этого нужно импортировать модуль Math, выполнить чтение константы pi и вызов функций sin и cos. Или напишете заранее вычисленные значения? Что будет с наглядностью в таком случае? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 10:10 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Евгений Темиргалеев писал(а):
Не забывайте, что Вы работаете в компонентной среде! /...
Евгений, Вы попали в самую точку. Истинная глубинная причина нашего спора не в том, что мы как-то по разному представляем себе назначение ресурсов и т. д., а в том, что некоторые идеи, реализованные в Блэбокс, вступили в противоречие с моими собственными идеями. Компонентную среду можно реализовать по-разному, сохранив основные принципы. И Блэкбокс мне тем и нравится, что если что-то не устраивает, то садись и делай как тебе нравится (с учётом лицензионных ограничений :) ). После Delphi от такой свободы просто дух захватывает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 10:20 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
Код:
PROCEDURE Init;
VAR
   i, k: SHORTINT;
BEGIN
   (* Identity matrix init *)
   ASSERT(LEN(Identity) = LEN(Identity[0]), 20); (* square matrix *)
   Identity[0, 0] := 1;
   FOR i := 1 TO LEN(Identity) - 1 DO
      FOR k := 0 TO i - 1 DO (* from side to (but excluding) diagonal *)
         Identity[i, k] := 0; (* fill with zeroes *)
         Identity[k, i] := 0 (* from both sides *)
      END
      Identity[i, i] := 1 (* put diagonal element *)
   END
END Init;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 10:30 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1122
Илья Ермаков писал(а):
Да ну...
Вынесите в отдельный модуль группу таких "констант" - и всего-то делов.

Без строк тоже можно было бы обойтись.
Код:
 s[0]:='H';  s[1]:='e';  s[2]:='l';  s[3]:='l';  s[4]:='o';  s[5]:=' ';
 s[6]:='w';  s[7]:='o';  s[8]:='r';  s[9]:='l';  s[10]:='d';  s[11]:='!';
 s[12]:=0X;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 10:48 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Trurl писал(а):
Без строк тоже можно было бы обойтись.
Верно подмечено :lol: .
Главный вопрос "Чем так плохи конструкторы массивов?" пока повис в воздухе. Хотелось бы услышать внятные неоспоримые доводы, как про GOTO


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 11:07 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 571
Откуда: Россия, Санкт-Петербург
Повторюсь ещё раз для всех.
Разница в наглядности!

Для примера Borland Pascal (Delphi):
Код:
UNIT Matrix;
INTERFACE
TYPE
  Matrix3d = ARRAY [0..3, 0..3] OF REAL;
CONST
  Ident: Matrix3d =
 ((1, 0, 0, 0),
  (0, 1, 0, 0),
  (0, 0, 1, 0),
  (0, 0, 0, 1));
IMPLEMENTATION
END.


Тоже на Active Oberon
Код:
MODULE Matix;
TYPE
  Matrix3d* = ARRAY 4, 4 OF REAL;
VAR
  Ident-: Matix3d;
  i, j: INTEGER;
BEGIN
  FOR i:=0 TO 3 DO
    FOR j:=0 TO 3 DO
      IF i = j THEN
        Ident[i, j] := 1;
      ELSE
        Ident[i, j] := 0
      END
    END
  END
END Matrix.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 11:21 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Вариант с Active Oberon выигрывает только в том, что позволяет легко адаптировать алгоритм для единичной матрицы любой разумной размерности.
В случае же маленькой размерности, как в приведённом примере, то вариант Delphi намного лучше, особенно если вспомнить, что программы пишутся не только для компиляторов, но и для людей.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 11:38 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 975
Откуда: Украина, Киев
В случае Оберона даже если-бы компилятор и допускал инициализацию массивов, их можно было-бы инициализировать только чем-то легко вычислимым без обращения к библиотекам... Поскольку, не знает компилятор, что такое sin и cos.
Для инициализации одной лишь единичной матрицы этого пожалуй хватило-бы :) Стоит ли необходимость усложнения компилятора такой возможности?
Избавлениё от библиотечных функций в компиляторе не только его упростило, а ещё и уменьшило зависимость от платформы. И кроме того насколько возросла гибкость... нужна математика с одинарной точностью импортируем Math, нужна с двойной импортируем Math := MathL.
А человек, читающий текст программы должен понимать в теории "что такое единичная матрица, и счём её едят" :)

PS. Можно привести вид единичной матрицы и в коментарии:
Код:
(* Identity matrix
  | 1  0  0  0 |
  | 0  1  0  0 |
  | 0  0  1  0 |
  | 0  0  0  1 |
*)
так даже нагляднее, нет мусора из скобок и запятых :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 12:07 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 7947
Откуда: Троицк, Москва
Madzi писал(а):
Повторюсь ещё раз для всех.
Разница в наглядности!
Если циклы в одну кучу не сваливать, то наглядности вполне достаточно:
Код:
MODULE Matix;
TYPE  Matrix3d* = ARRAY 4, 4 OF REAL;
VAR
  Ident-: Matix3d;
  i, j: INTEGER;
BEGIN
  FOR i:=0 TO 3 DO
    FOR j:=0 TO 3 DO
      Ident[i, j] := 0
    END
  END;
  FOR i:=0 TO 3 DO
    Ident[i, i] := 1
  END
END Matrix.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: "Типизированные константы"
СообщениеДобавлено: Четверг, 06 Ноябрь, 2008 12:21 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Ярослав Романченко писал(а):
Избавлениё от библиотечных функций в компиляторе не только его упростило, ...
Строго говоря, не полностью избавился. DevCPC486 вызывает процедуры NewRec и NewArr из Kernel.
Хотя, модуль Kernel в некотором смысле можно рассматривать как продолжение (или начало?) компилятора, слишком уж он специфичен.


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

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


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

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


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

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