OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 15 Август, 2020 08:45

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




Начать новую тему Ответить на тему  [ Сообщений: 172 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
СообщениеДобавлено: Пятница, 08 Ноябрь, 2019 23:49 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 176
Откуда: Питер
Как при помощи Ofront+'а создать неконсольное приложение?
(у меня получаются только консольные)


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
В MinGW есть опция командной строки -mwindows для создания неконсольных приложений.

В проекте XDev есть подсистема WinDev, где есть несколько примеров оконных приложений:



Вложения:
GuiApps.png
GuiApps.png [ 69.49 КБ | Просмотров: 1022 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 09 Ноябрь, 2019 12:19 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
Ещё в качестве примера неконсольного приложения есть порт игры арканоид на библиотеке Graph (прослойка к SDL 2 от Артура Ефимова, взятая из Free Oberon):


Игра переписана с Monkey-X на Оберон-2 и компилируется при помощи XDev (через Ofront+) для Windows/Linux 32/64 бит. Думаю, для какой-нить малинки тоже соберётся.


Вложения:
Arkanoid.png
Arkanoid.png [ 42.65 КБ | Просмотров: 1007 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 09 Ноябрь, 2019 12:31 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
Я сейчас тестирую WriteLongReal после своих интеллигентных правок. И конечно есть расхождения с BlackBox. Например:

Код:
CONST
  _2* = MAX(REAL) / 2;
  _4* = MAX(REAL) / 4;
  _8* = MAX(REAL) / 8;
  _16* = MAX(REAL) / 16;
  a* = 1.7976931348623E+308;
  max* = MAX(REAL); min* = MIN(REAL);

BlackBox:
Код:
    _2 = 8.988465674311579E+307;
    _4 = 4.494232837155789E+307;
    _8 = 2.247116418577895E+307;
    _16 = 1.123558209288947E+307;
    a = 1.7976931348623E+308;
    max = 1.797693134862316E+308;
    min = -1.797693134862316E+308;

Ofront+
Код:
    _2 = 8.98846567431157E+307;
    _4 = 4.49423283715579E+307;
    _8 = 2.24711641857789E+307;
    _16 = 1.12355820928895E+307;
    a = 1.7976931348623E+308;
    max = 1.79769313486231E+308;
    min = -1.79769313486231E+308;

Очень плохо, что MAX(LONGINT) отличается. Но это предельное граничное число, поэтому ничего удивительного. И ещё: одинаковый код иногда по-разному считает в BlackBox и в Ofront+/GCC входящее вещественное число в сканере OPS. Это я объясняю тем, что GCC использует сопроцессор с 80-битовой вещественной арифметикой. BlackBox тоже использует его же, но GCC ещё и хранит промежуточные значения в 80-битной форме, а BlackBox нет.

Что будем с этим делать, GameHunter? Дело ещё и в мантиссе. Она при выводе числа считается сишной функцией ecvt (в Reals.ConvertL). Притом у меня нет ответа, кто более правильно считает — BlackBox или ecvt.

Ну, в общем, на днях закоммичу эти правки, хуже всё равно не стало, только лучше. Раньше эти граничные значения вообще вызывали ошибку 203 "number too large".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 10 Ноябрь, 2019 03:24 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 176
Откуда: Питер
Всё в порядке, покуда разница между ББ и Офронтом в 15-м знаке после запятой.

Цитата:
Очень плохо, что MAX(LONGINT)

Вы, наверное, MAX(REAL) имели в виду?


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
Да, точно. MAX(REAL)

А погрешность-то и 14-й знак после запятой задевает. А из-за заниженного MAX(REAL) вообще боюсь, что сузится диапазон допустимых чисел для расчётов.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 10 Ноябрь, 2019 10:42 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4442
Откуда: Россия, Орёл
Сильно не сузится. Это границы диапазона, на них в здравом уме никто считать не будет. А проблемы с вещественными можно огрести гораздо раньше.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 10 Ноябрь, 2019 11:27 

Зарегистрирован: Суббота, 04 Май, 2019 10:21
Сообщения: 18
The question about floating point numbers has been discussed in the center.Robert(author of Lib) is an expert,you'd better ask him if worry about it ;

Adding new features is not impossible, but we must consider whether it is really necessary, compatibility issues, the amount of code added, stability, implementation issues of other architectures... etc.

The center puts more focus on error handling than adding new features to make this product more stable .Subject to limited resources, they had to;

But the Russian community is open, there are many new ideas and projects here(Including your). I like it;


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
Поправлена работа с большими вещественными числами. Устаревшая функция ecvt заменена на sprintf. При конвертации длинного вещественного в строку точность у sprintf повыше, чем это делает BlackBox. Не то чтобы я не хотел переписать конвертацию на Оберон, но это потом.

Александр Ширяев успешно собрал Ofront+ для OpenBSD x86. А сборка для FreeBSD x64 закончилась неудачей (из-за отсутствия поддержки в ней этой самой ecvt). Сейчас можно опять пробовать.

Я реструктурировал проект, теперь в нём есть папка Target, в которой размещены файлы для поддержки следующих платформ:

- Linux64
- Linux86
- LinuxArm
- Win32
- Win64

Саша, у меня такая просьба: если будет время/желание, пособирай Ofront+ для разных систем на базе BSD, чтобы добавить в Target поддержку сборки и под них.

Если у кого-то есть возможность собрать Ofront+ для macOS, будет тоже интересно.


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
Для обсуждения вопросов развития Ofront+ создана группа в Телеграме:


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 08 Декабрь, 2019 23:06 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1296
Oleg N. Cher писал(а):
Это я объясняю тем, что GCC использует сопроцессор с 80-битовой вещественной арифметикой. BlackBox тоже использует его же, но GCC ещё и хранит промежуточные значения в 80-битной форме, а BlackBox нет.

Насколько я помню, GCC использует арифметику с произвольной точносттью.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 29 Декабрь, 2019 06:45 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 176
Откуда: Питер
Ofront+ для компонентного паскаля инициализирует указатели и переменные процедурного типа NIL'ами, как это требует компонентный паскаль (это касается и переменных, и стркутур в динамической памяти)? А то в описании опции p написано что-то невнятное...


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
Инициализирует. Не сделана ещё инициализация OUT-параметров-указателей, но там немного работы, надо просто посвятить вечерок и сделать.

Опция -p очень простая: не инициализировать или инициализировать все указатели NIL'ом. По умолчанию, естественно, инициализировать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 31 Декабрь, 2019 23:28 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 176
Откуда: Питер
Вот модуль:
Код:
MODULE Ex;

IMPORT
  C:=Console;

(* PROCEDURE P ( VAR x : RECORD END );
  BEGIN
  END P; *)

BEGIN
  C.String('!!!'); C.Flush();
END Ex.


Он, как и положено, выводит на экран !!!. Однако, если раскомментировать процедуру P, модуль успешно компилируеися, но на экран ничего не выводится. Наверное, какая-то ошибка компилятора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Январь, 2020 16:19 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
Эта ошибка исправлена. Спасибо за информацию.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 01 Январь, 2020 22:33 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 176
Откуда: Питер
Ещё раз про инициализацию переменных.

Вот такой модуль выводит на экран, что переменные ptr и proc процедуры TestStack не инициализированы NIL'ами:

Код:
MODULE Ex;

IMPORT
  C:=Console;

CONST
  NumOfPoints = 1000;

TYPE
  PlugStruct = POINTER TO RECORD
  END;

PROCEDURE PlugProc ();
  BEGIN
  END PlugProc;

PROCEDURE FillStack ();
  VAR
    ptr:ARRAY NumOfPoints OF PlugStruct;
    proc:ARRAY NumOfPoints OF PROCEDURE;
    i:INTEGER;
  BEGIN
    FOR i:=0 TO NumOfPoints-1 DO
      NEW(ptr[i]);
      proc[i]:=PlugProc;
    END;
  END FillStack;

PROCEDURE TestStack ();
  VAR
    ptr:ARRAY NumOfPoints OF PlugStruct;
    proc:ARRAY NumOfPoints OF PROCEDURE;
    i:INTEGER;
  BEGIN
    i:=0;
    WHILE (i<NumOfPoints) & (ptr[i]=NIL) DO
      INC(i);
    END;
    IF i=NumOfPoints THEN
      C.String('All pointers are NILs');
    ELSE
      C.String('Pointer No. '); C.Int(i,0); C.String(' is not NIL');
    END;
    C.Ln();

    i:=0;
    WHILE (i<NumOfPoints) & (proc[i]=NIL) DO
      INC(i);
    END;
    IF i=NumOfPoints THEN
      C.String('All procedures are NILs');
    ELSE
      C.String('Procedure No. '); C.Int(i,0); C.String(' is not NIL');
    END;
    C.Ln();
    C.Flush();
  END TestStack;

BEGIN
  FillStack();
  TestStack();
END Ex.


Этот же модуль в ББ (модифицированный, чтобы выводить результат в лог) показывает, что в ББ эти переменные инициализируются.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 06 Январь, 2020 17:52 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
GameHunter, а я думал, что по Ofront'у меня уже ничем не удивить. :-)

Да, это действительно такого рода ошибка, которая может породить настоящие наведённые проблемы. Оказывается, Йозеф специально не инициализировал массивы указателей для эффективности кода, Ofront же появился ещё во времена "малых" мощностей. Но сейчас он согласен, что это хорошо бы исправить.

Я взял решение из CPfront, где эта проблема была решена уже давно:


Заодно сделал поддержку OUT-параметров в Компонентном Паскале (режим -C).

И ещё некоторые внутренние изменения структуры компилятора, не очень заметные извне.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 06 Январь, 2020 21:57 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 176
Откуда: Питер
В c-файлах объявление для локальных переменных процедуры выглядит так:
Код:
void (*prc)(void) = NIL;
struct Ex__2 *ptr = NIL;
void (*arr[10])(void) = {0};
,
а для глобальных переменных модуля - так:
Код:
static void (*Ex_prc)(void);
static struct Ex__1 *Ex_ptr;
static void (*Ex_arr[10])(void);
.
Отсюда вопрос: есть ли инициализация указателей и процедур, если они содержатся в глобальных переменных?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 06 Январь, 2020 22:05 

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 1093
Откуда: Киев
Да, потому что это задано стандартом Си.
Иногда рекомендуют инициализировать явно, потому что некоторые компиляторы могут нарушать стандарт.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Январь, 2020 12:51 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 406
Откуда: Украина, Днепропетровская обл.
Да, правильно. Переменные, помеченные static, по стандарту обнуляются.


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

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


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

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


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

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