OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 05 Декабрь, 2019 23:29

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




Начать новую тему Ответить на тему  [ Сообщений: 108 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
СообщениеДобавлено: Среда, 02 Октябрь, 2019 14:18 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
Новости проекта Ofront+. Я работаю над реализацией конкатенации строк. Сейчас уже компилится такой код:
Код:
MODULE TestConcat; IMPORT Console;

CONST Str* = "String 1 "+ 0DX + 0AX + 0X + "String 2 " + '"' + "'" + 0FFX;
Str2* = "  '  ";
Str3* = '  "  ';

VAR str: ARRAY 13 OF SHORTCHAR;

BEGIN
   str := "Hello, ";
   str := str + "World";
   Console.WriteStr(str); Console.WriteLn;
   Console.WriteInt(LEN(str$)); Console.WriteLn;
END TestConcat.

Также подправил вывод строк в браузере символьников и, на мой взгляд, он сейчас их выводит лучше, чем ББ-шный:
Код:
DEFINITION TestConcat;

  CONST
    Str = "String 1 " + 0DX + 0AX + "String 2 " + 22X + "'" + 0FFX;
    Str2 = "  '  ";
    Str3 = '  "  ';

END TestConcat.
Для сравнения вот что выдаёт ББ:
Код:
DEFINITION TestConcat;

   CONST
      Str = "String 1 " + 0DX + 0AX + "String 2 "'ÿ";
      Str2 = "  '  ";
      Str3 = "  "  ";

END TestConcat.

Ещё я оптимизировал операцию str := str + str2, которая до моей правки сводилась к двум низкоуровневым операциям:
Код:
MODULE TestConcat; VAR str: ARRAY 13 OF SHORTCHAR;
BEGIN
   str := str + "World"
END TestConcat.
Код:
   __STRCOPYSS(TestConcat_str, TestConcat_str, 13); // <-- copy string into itself
   __STRAPNDSS("World", TestConcat_str, 13);

После правки операция копирования строки саму в себя убрана.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 02 Октябрь, 2019 14:20 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
Кстати, обращаю внимание мэйнтейнеров собственных сборок BlackBox. Я не удивлюсь, если в них присутствует эта же проблема - копирование строки саму в себя при конкатенации. Похоже, что OMinc эту оптимизацию планировали, просто она у них не срабатывает по недосмотру: процедура OPV.SameExp (n1, n2: OPT.Node): BOOLEAN возвращает TRUE, если выражение одно и то же. Она-то и призвана отсечь копирование строки саму в себя. Но после псевдооперации преобразования типа "массив" к типу "строка" он уже не воспринимается этой процедурой как та же сущность, и она срабатывает некорректно. Правлю так:

Код:
   PROCEDURE SameExp (n1, n2: OPT.Node): BOOLEAN;
   BEGIN
+      IF (n2^.class = Nderef) & (n2^.typ^.form = String) THEN n2 := n2^.left END;
      WHILE (n1^.class = n2^.class) & (n1^.typ = n2^.typ) DO

Т.е. если последняя операция это преобразование массива к строке, то мы для сравнения её откатываем. Это работает.

Ссылка на коммит: https://github.com/Oleg-N-Cher/OfrontPl ... bf834b295d

Отпишитесь, пожалуйста, если удастся исправить это в какой-то сборке BlackBox.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Октябрь, 2019 17:51 

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

TYPE
  Arr = ARRAY 3,4 OF REAL;

PROCEDURE Do1 (): POINTER TO Arr;
  BEGIN
    RETURN NIL
  END Do1;

END Test.


Хм... Что-то по прежнему не генерируется .c-файл для этого тестового модуля


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Октябрь, 2019 18:33 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 159
Откуда: Питер
Vinovat, oshibsha. Ispol'zoval ne tot exe-shnik.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Октябрь, 2019 18:42 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
Ну вот и хорошо. Там ещё сделана маленькая правочка, связанная с этой проблемой. Перекачайте бинарь.

Эх... я уже привык, что про баги пишут публично, а хвалят приватно. Наверно чтобы никто не видел. ;-)


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 971
Откуда: Киев
Планируется ли поддержку O7 довести до возможности собирать код на О7 или как и в мультиобероне поддержка будет приблизительной?


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

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

Дело за желающими помочь на уровне "теперь сделай вот то-то". Я открыт к таким предложениям.

А в мультиобероне есть поддержка O7? Она там вроде заявлена только гипотетически.


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

Зарегистрирован: Четверг, 08 Май, 2008 19:13
Сообщения: 971
Откуда: Киев
Oleg N. Cher писал(а):
Я открыт к таким предложениям.
Для того и спросил, чтобы узнать, нужны ли Вам такие предложения.

Oleg N. Cher писал(а):
смущает разброс разночтений
Зря смущает, критических разночтений там нет. Если же имеющиеся разночтения Вы считаете критическими, то и O2, и КП должны смущать во многом. Но является ли это препятствием для чего-то?


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
Тестовый модуль в ББ компилируется:

Код:
MODULE Test;

TYPE
  Arr = ARRAY 2,3 OF REAL;
  Ptr = POINTER TO Arr;

VAR
  a:Arr;

PROCEDURE Do (): Ptr;
  BEGIN
    RETURN NIL
  END Do;

BEGIN
  a:=Do()^;
END Test.

Ofront+ выдаёт ошибку: 16:10 err 78 dereferenced object is not a variable

Такие выражения не допускает оригинальный Ofront, но понимает их по частям: в первом выражении присвоение указателю результата вызова функции, во втором — разыменование.

Исправил. Спасибо за информацию.



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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
Я было подумал, что будут какие-то накладки соединения вызова метода с разыменованием с синтаксисом супервызова, но попробовал и убедился, что ^ в супервызове пишется до скобок, а ^ при разыменовании — после скобок. Получается любопытный синтаксис, который работает сейчас и в Ofront'е+, и в BlackBox:
Код:
MODULE Test;

TYPE
   Arr = ARRAY 2,3 OF REAL;
   Ptr = POINTER TO Arr;

TYPE
   Father = EXTENSIBLE RECORD END;
   Child = RECORD (Father) END;

VAR
   a: Arr;

PROCEDURE (VAR self: Father) Do (): Ptr, NEW, EXTENSIBLE;
BEGIN
   RETURN NIL
END Do;

PROCEDURE (VAR self: Child) Do (): Ptr;
BEGIN
   a := self.Do^()^; (* Супервызов с разыменованием *)
   RETURN NIL
END Do;

END Test.


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

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1133
Откуда: СССР v2.0 rc 1
Не надо так делать, Олег.
Забавно и не более. Нельзя давать расползаться семантике и синтаксису.


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
Это не я так делаю, Валера. Это OMinc так сделали. Я поддерживаю совместимость с КП, не более того.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 22 Октябрь, 2019 00:15 

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

Цитата:
MODULE Test;

TYPE
T1 = ARRAY 5 OF REAL;
T2 = ARRAY 5 OF T1;

PROCEDURE Do4 ( IN x:ARRAY OF ARRAY OF REAL );
BEGIN
END Do4;

PROCEDURE Do3 ( IN x:ARRAY OF T1 );
BEGIN
Do4( x );
END Do3;

END Test.

Он успешно компилируется, но получившиеся c-файлы дальше не компилируются.
Смотрим Test.c:

Код:
/* Ofront+ 1.0 -mC -88 */
#include "SYSTEM.h"

typedef
   REAL Test_T1[5];

typedef
   Test_T1 Test_T2[5];




static void Test_Do3 (Test_T1 *x, INTEGER x__len);
static void Test_Do4 (REAL *x, INTEGER x__len, INTEGER x__len1);


/*============================================================================*/

static void Test_Do4 (REAL *x, INTEGER x__len, INTEGER x__len1)
{
}

static void Test_Do3 (Test_T1 *x, INTEGER x__len)
{
   Test_Do4((void*)x, x__len, x__len1);
}


int main(int argc, char **argv)
{
   __INIT(argc, argv);
   __REGMAIN("Test", 0);
/* BEGIN */
   __FINI;
}

Вызов процедуры Do4 из процедуры Do3 находим в 25-й строке:
Код:
Test_Do4((void*)x, x__len, x__len1);

В этом вызове присутствует необъявленная в c-файле переменная x__len1


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

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

Пока только скажу, что эта ошибка также есть и в оригинальном Ofront (и в voc / Free Oberon, естественно, тоже). Так что не грех и Йозефу Темплу сообщить. А CPfront на этом же коде вместо x__len1 генерит 5.



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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
Проблема с длиной массива исправлена, попутно найдена ещё одна некритичная ошибка, которая передаёт несовместимые параметры-указатели. Эта тоже исправлена.

Ошибка передачи несовместимых указателей была и в CPfront.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 30 Октябрь, 2019 20:36 

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

Цитата:
MODULE Test;

IMPORT
C:=Console;

VAR
x:ARRAY 3,3 OF INTEGER;
i,j:INTEGER;

PROCEDURE Sum (IN x:ARRAY OF INTEGER): INTEGER;
(* Сумма элементов массива *)
VAR
result:INTEGER;
j:INTEGER;
BEGIN
result:=0;
FOR j:=0 TO LEN(x)-1 DO
result:=result+x[j]
END;
RETURN result
END Sum;

PROCEDURE Sum1 (IN x:ARRAY OF ARRAY OF INTEGER): INTEGER;
(* Сумма элементов подмассива x[1] *)
BEGIN
RETURN Sum(x[1])
END Sum1;

BEGIN
(* Инициализируем массив x *)
FOR i:=0 TO LEN(x)-1 DO
FOR j:=0 TO LEN(x,1)-1 DO
x[i,j]:=i+j;
END;
END;

(* Выводим элементы массива x на экран, чтобы убедиться, что всё в порядке *)
FOR i:=0 TO LEN(x)-1 DO
FOR j:=0 TO LEN(x,1)-1 DO
C.Int(x[i,j],5);
END;
C.Ln();
END;
C.Ln;
C.Ln;

(* Сумма элементоа подмассива x[1]. Выводится 6, - это правильный результат *)
C.Int(Sum(x[1]),0); C.Ln();
C.Ln;
C.Ln;

(* Сумма элементоа подмассива x[1]. Выводится 4, - это неправильный результат *)
C.Int(Sum1(x),0); C.Ln();
END Test.


Вот что скомпилированная программа выводит на экран:
0 1 2
1 2 3
2 3 4


6


4

В главном теле программы происходит инициализация массива x, затем на экран выводятся его элементы, чтобы проверить, что всё правильно проинициализировано.

Затем опретор C.Int(Sum(x[1]),0) вычисляет сумму элементов подмассива x[1] и выводит его на экран. Выводится 6, это правильно.

Затем опретор C.Int(Sum1(x),0) вычисляет сумму элементов подмассива x[1] и выводит его на экран. Выводится 4, это неправильно.

Похоже, процедура Sum1 компилируется с ошибкой.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 01 Ноябрь, 2019 21:46 

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

Код:
MODULE Test;

CONST
  asdf = 1.000000001E+0308;

END Test.

При компилировании выдаётся ошибка: 4:9 err 203 number too large
Если вместо 1.000000001E+0308 написать 1.0E+0308, - компилиркется.

Это ошибка, т.к. asdf меньше предельнго допустимого значения для 64-битного вещественного числа, которое в десятичном представлении равно 1.79769313486231571E+0308.


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
Спасибо за информацию, GameHunter. По массивам: действительно фиксирую ошибку, которая имеется в исходном Ofront'е. Кстати, пропадает, если убрать IN (а с VAR тоже присутствует). И в CPfront'е её уже нет, исправили.


По поводу сверхбольших вещественных чисел: похоже, что это родовая проблема OP2, начиная ещё с ETH Oberon'а. Да, по-хорошему нужно что-то с этим сделать.


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

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


Насчёт сверхбольших вещественных чисел буду думать.


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 348
Откуда: Украина, Днепропетровская обл.
После сегодняшней правки Ofront+ стал понимать сверхбольшие числа на ввод.

Код:
MODULE Test;

CONST
  asdf* = 1.000000001E+308;
  a* = 1.79769313486231571E+308;

VAR r1, r2: REAL;

PROCEDURE Abc;
BEGIN
  r1 := asdf;
  r2 := a;
END Abc;

END Test.

Ofront+ для BlackBox транслирует это. Результат:
Код:
static void Test_Abc (void)
{
   Test_r1 = (5.000000005E+307 * 2);
   Test_r2 = (8.988465674311579E+307 * 2);
}

Версия для командной строки даже не понимает последнее присваивание. Её вывод:
Код:
static void Test_Abc (void)
{
   Test_r1 = (  5.00000000500000e+307 * 2);
}

Интерфейс скомпилированного ею модуля через утилиту showdef выглядит так:

Код:
DEFINITION Test;

  CONST
    a =  NaN                   ;
    asdf =   1.00000000100000D+308;

END Test.

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

При трансляции Си-файла вывод вещественных чисел Ofront+ для командной строки осуществляет через старый ETH-овский модуль Texts, работа с вещественными числами в котором очень далека от совершенства, мягко говоря. Если сможете помочь с этим, буду признателен (процедура WriteLongReal).


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

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


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

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


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

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