OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Воскресенье, 26 Октябрь, 2008 10:50 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 575
Откуда: Россия, Санкт-Петербург
Может быть глупый вопрос, но подскажите пожалуйста как запустить под A2 своё приложение?

Создаю модуль (см. ниже), IDE его успешно компилирует, но запустить его я не могу :(

Когда я пишу SomeName то среда мне говорит, что такого модуля нет.
А если я пишу SomeName.Start, то возвращается ошибка что в модуле нет такой процедуры.

В чём же секрет?

MODULE SomeName;

IMPORT ...

...

TYPE
MyApp = OBJECT(WMComponents.FormWindow)
...
PROCEDURE &New();
...
END New;
...
END MyApp;

PROCEDURE Start*(par: ANY): ANY;
VAR
App: MyApp;
BEGIN
NEW(App);
RETURN NIL;
END Start;

END SomeName.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 26 Октябрь, 2008 11:03 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Madzi писал(а):
Может быть глупый вопрос, но подскажите пожалуйста как запустить под A2 своё приложение?

Вполне нормальный вопрос
Нужно поменять
Код:
PROCEDURE Start*(par: ANY): ANY;

на
Код:
PROCEDURE Start*;

Естествено убрать RETURN
Еще вынеси в глобальные переменны VAR
App: MyApp;

Дальше в любом тексте, можно и в исходнике пишешь
Код:
SomeName.Start ~

Кликаешь правой кнопкой по слову Start. Появится круглая менюшка. Не отжимая кнопку мыши, выбирай "Start" в меню

Вобщем сейчас просто времени не хватает, более подробно ответить, но думаю у тебя все получится ;)

PS: А вообщето, нужно в ETH комуто дать хороший пинок :twisted: столько времени не могут примеры поправить :twisted:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 26 Октябрь, 2008 11:31 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
bohdant писал(а):
Код:
PROCEDURE Start*;
Можно так, а можно ещё и с передачей контекста в приложение:
Код:
PROCEDURE Start*(context: Commands.Context);
Естественно, нужно в секцию IMPORT включить модуль Commands. Из контекста можно получить параметры командной строки и выводить с помощью него сообщения в лог. А если контекст переприсвоить глобальной переменной в модуле, то можно выводить в лог сообщения из любой процедуры.
Лучше всего изучить объект Context по исходнику модуля Commands.Mod :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 26 Октябрь, 2008 11:39 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 575
Откуда: Россия, Санкт-Петербург
Спасибо большое. Получилось.

Да, с документацией для A2 (AOS) действительно проблемы (и не только под эту систему).
Будем эту проблему исправлять и внедрять в учебный процесс :).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 16:30 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 575
Откуда: Россия, Санкт-Петербург
Ещё один глупый вопрос.
Никак не могу понять, как мне получить указатель на переменную.

Допустим у меня есть тип
Код:
TYPE
  Type = POINTER TO TypeDesc;
  TypeDesc = RECORD
    ...
  END;

и далее в тексте
Код:
VAR
  vt: ARRAY 50 OF TypeDesc;
  curt: Type;

хочется иметь возможность присваивать переменной curt адреса элементов массива vt, например:
Код:
  curt := ADDRESS(vt[10]);

Как это сделать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 16:57 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
В Оберонах нету операции взятия адреса, адрес статического объекта получить нельзя. Указатели используются только для создания объектов динамически при помощи NEW.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 17:05 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
Madzi писал(а):
Как это сделать?
Так сделать нельзя.
Указатель (если он не нулевой) может указывать только на отдельную переменную в динамической памяти (куче).
Но уверен, что можно найти подходящее для Вашей задачи другое решение.
На вскидку.
1. Кроме указателей можно использовать "курсоры" - целочисленные переменные, хранящие индексы в массиве.
2. Можно завести не массив TypeDesc, а массив Type.
3. Можно вызывать процедуры с типом аргумента VAR v: TypeDesc.
И т.д.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 17:56 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Никогда не говори никогда :wink:
Код:
MODULE testadr;
IMPORT SYSTEM,KernelLog;
TYPE
   TypeDesc = RECORD
      a:BOOLEAN;
      b:LONGINT;
   END;
VAR
    vt: ARRAY 50 OF TypeDesc;
    testvar:LONGINT;
    adr : SYSTEM.ADDRESS;
PROCEDURE AAA*;
BEGIN
   adr:=SYSTEM.ADR(vt[3]);
   KernelLog.Address(adr);   KernelLog.Ln;
   adr:=SYSTEM.ADR(vt[14]);
   KernelLog.Address(adr);KernelLog.Ln;
   adr:=SYSTEM.ADR(vt[15]);
   KernelLog.Address(adr);KernelLog.Ln;
END AAA;
END testadr.AAA~


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 18:00 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Проверил, можно даже так:
adr:=SYSTEM.ADR(vt[15].b);


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 18:13 
Аватара пользователя

Зарегистрирован: Суббота, 19 Ноябрь, 2005 15:59
Сообщения: 803
Откуда: Зеленоград
bohdant писал(а):
Никогда не говори никогда :wink:
Конечно, в обход системы типов (IMPORT SYSTEM) можно многое сделать. :roll:
Но не лучше ли тогда просто использовать Си?
Теперь по сути вопроса.
Не знаю, как конкретно обстоит дело в АО, но в Обероне адрес записи еще не есть её полноценный указатель.
Дело в том, что в записях в динамической памяти содержится (скрытый) указатель на дескриптор типа (т.н. type tag), а записям в стеке и статической памяти с этим не повезло.
IMHO, если мы возьмём и передадим адрес такой записи в качестве указателя, могут случиться разные неприятности. Например, при динамической проверке типа IF p IS Type THEN ... END.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 19:08 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
AVC писал(а):
Конечно, в обход системы типов (IMPORT SYSTEM) можно многое сделать. :roll:
Но не лучше ли тогда просто использовать Си?

А зачем использовать Си если можно и АО?
В том то и дело, что бывают "узкие" места, где важна скорость.
Конечно, нужно еще незабывать, что можно использовать секцию CODE :)

А по большому, мне АО этим и нравится: Нельзя! ....но если сильно хочется, то можно :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 22:41 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Madzi писал(а):
Код:
  curt := ADDRESS(vt[10]);

Как это сделать?

А - ЗАЧЕМ???
Обероны всячески отваживают от подобной практики и подходов.
ЧТО ТАКОЕ "указатель на элемент массива"?
Вы уже и так на него ссылаетесь через индекс.
Про аргумент "эффективность" можно забыть.
Всё может смениться при переходе на другую платформу. Даже на Си я, работая на Мегах, пришёл к заключению, что адресация через индекс ЭФФЕКТИВНЕЕ, при работе с элементами массивов, чем ПРЯМАЯ АДРЕСАЦИЯ! Просто в силу кодов проца, реализующих индексное смещение (относительную адресацию)...

Си поощряет "раннюю оптимизацию" (к чему это ведёт в учебниках и советах аксакалов хорошо описано). Обероны заставляют сначала общо решить задачу.

Решайте задачи!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 23:44 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Я думаю, что все можно свести к такому варианту ;) и все проблемы уйдут...
Код:
VAR
  vt: ARRAY 50 OF Type;
  curt: Type;


Владимир Лось писал(а):
А - ЗАЧЕМ???
Обероны всячески отваживают от подобной практики и подходов.

Кстати поглядел я исхдохники Аоса: там сплош и рядом адрессная арихметика :))
Почему? У кого какие идеи?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 04 Ноябрь, 2008 23:59 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 575
Откуда: Россия, Санкт-Петербург
bohdant писал(а):
Я думаю, что все можно свести к такому варианту ;) и все проблемы уйдут...
Код:
VAR
  vt: ARRAY 50 OF Type;
  curt: Type;


Попробую свести, но с налёту не получится, буду думать...
bohdant писал(а):
Я думаю, что все можно свести к такому варианту ;) и все проблемы уйдут...
Владимир Лось писал(а):
А - ЗАЧЕМ???
Обероны всячески отваживают от подобной практики и подходов.

Кстати поглядел я исхдохники Аоса: там сплош и рядом адрессная арихметика :))
Почему? У кого какие идеи?

Я так полагаю, что ради скорости портирования. Т.е. часть кода Аос не оригинальная, а портирована с того же Си (драйвера, например)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 07:34 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Удалено модератором.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 09:17 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 09:27 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1488
Откуда: Украина, Киев
к Madzi:
Попадался-ли Вам в руки такой документик http://nativesystems.inf.ethz.ch/pub/Ma ... lgebra.pdf
Это векторно-матрично-тензорные расширения к AO.
С использованием возможно производить операции даже между частями векторов и матриц.
Код:
var
  M,N: array [* ,*] of real ;
  v: array [*] of integer;
  w: array [*] of real ;
procedure P(var a: array [* ,*] of real );
procedure Q(const a: array[*] of real );
procedure R (): array [*] of integer;
begin
  new(M ,3 ,5); NEW (w ,10); (* creation *)
  M := [[1 ,2 ,3] ,[4 ,5 ,6]]; (* (re -) allocation if necessary *)
  w [1..3] := M [1 ,*]; (* assignment *)
  P(M [0..3 ,0..3]); Q(v [*]); v := R (); (* procedure calls *)
PS. Правда, это пока не очень оптимально по скорости...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 09:33 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 297
Откуда: Київ, Україна
Madzi писал(а):
Я так полагаю, что ради скорости портирования. Т.е. часть кода Аос не оригинальная, а портирована с того же Си (драйвера, например)

Я тоже так думаю, однако иногда действительно полезно:
Код:
            ASSERT ( tail + n <= LEN( buf ) );   (* index check *)
            SYSTEM.MOVE( SYSTEM.ADR( x[ofs] ), SYSTEM.ADR( buf[tail] ), n );  INC( tail, n ); 

Кстати статистика: в каждом шестом модуле применяется :mrgreen:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 05 Ноябрь, 2008 19:31 
Аватара пользователя

Зарегистрирован: Суббота, 12 Июль, 2008 22:49
Сообщения: 575
Откуда: Россия, Санкт-Петербург
Ярослав Романченко писал(а):
к Madzi:
Попадался-ли Вам в руки такой документик http://nativesystems.inf.ethz.ch/pub/Ma ... lgebra.pdf
Это векторно-матрично-тензорные расширения к AO.
С использованием возможно производить операции даже между частями векторов и матриц.
Код:
...

PS. Правда, это пока не очень оптимально по скорости...

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


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

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


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

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


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

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