Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 19 мар 2024, 07:35

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: 21 май 2018, 09:21 
Не в сети

Сообщения: 22
Zorko писал(а):
А что значит не находит Log?

IMPORT Log;
symbol file of imported module not found

И на вставки сишного кода, которые возможны у ofront, ругается.
Код: "OBERON"
  1. PROCEDURE -String* (str: ARRAY OF CHAR)
  2. 'printf("%s", str)';
  3.  


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 май 2018, 20:46 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Дмитрий, мы ядро-то ещё толком не собрали со сборщиком мусора. А модуль Log тянет не только его, но и пол-БлэкБокса вместе с оконной графической подсистемой. Консольку возьмите для начала. Можно вот эту (под CPfront не тестировалась!).

Вы тут уже успешно ходите по тем граблям CPfront'а, которые я уже зафиксил в Ofront+. Нужно так:
Код: "OBERON"
  1. PROCEDURE [code] String* (str: ARRAY OF SHORTCHAR) 'printf("%s", str)';
Транслируя это, моментально вылетает ошибка в CPC.CProcDefs, связанная с рассинхронизацией логики её работы с той, которая в новых версиях BlackBox. Думаю сделать фикс, но нужно принять важное решение. В BlackBox модель вызова процедур по умолчанию — stdcall. В CPfront модель вызова процедур по умолчанию — ccall, то бишь cdecl. Что мы можем с этим сделать?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 21 май 2018, 22:18 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Я сделал исправление, прошу обновить CPfront.

С ним уже транслируется такой код (для форума я заменил тег code в квадратных скобках на {code}):

Код: "OBERON"
  1. MODULE PrivMod; IMPORT SYSTEM;
  2.  
  3. PROCEDURE {code} AAincludeStdio* "#include <stdio.h>";
  4.  
  5. PROCEDURE {code} String* (str: ARRAY OF SHORTCHAR)
  6. 'printf("%s", str)';
  7.  
  8. BEGIN String("Hello World!")
  9. END PrivMod.

Но, в основном, всё же в CPfront заложен механизм для описания биндингов, более похожий на тот, который в BlackBox. Вы можете найти на просторах инета файл LinLibc, и CPfront его даже соберёт. Получится символьный файл Lin/SymOF/Libc.osf и возможность вызывать из него процедуры. И этот способ тоже работает. Пробуйте.

Код: "OBERON"
  1. MODULE PrivMod2; IMPORT LinLibc;
  2. BEGIN
  3. IF LinLibc.printf("Hello World!") = 0 THEN END
  4. END PrivMod2.

Файл "libc.so.6", упоминаемый в сгенеренной Си-программе, видимо, нужно делать самому.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 22 май 2018, 07:17 
Не в сети

Сообщения: 22
Понятно.
Я просто пробовал вставить свой консольный модуль Log для Ofronta с определенными String как вставка print и проч.
Режет глаза немного использование PROCEDURE [code] String для сишной вставки, в DevCompiler [code] вставляет машинные коды.

А 64-бита вы пробовали? В vishap работает.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 22 май 2018, 12:03 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Дмитрий Дагаев писал(а):
Режет глаза немного использование PROCEDURE {code} String для сишной вставки
Ничего не поделаешь, это реализовано на уровне фронт-энда. CPfront использует ББ-шный фронт-энд.

Дмитрий Дагаев писал(а):
А 64-бита вы пробовали? В vishap работает.
Пробовали. В Ofront+ тоже работает. Есть нативные версии командной строки для 32 и 64 бит Linux и Windows. А в CPfront'е это появится не раньше, чем 64-битная версия ББ. По тем же причинам: внутри ББ есть много привязок к 32-битной разрядности указателей. И CPfront это унаследовал. Я хотел бы в итоге CPfront и Ofront+ слить в один проект, но это процесс долгий и сложный. Как пойдёт. Ну и — если будут какие-то финансовые возможности, это только в плюс.

По поводу моего исправления. Суть его в том, что мы с Йозефом ковыряли процедуру DevCPP.GetCode. Убирали лимит на размер кодовых процедур, ещё Йозеф сделал пару фич. И CPfront был несовместим с новой версией GetCode. А после фикса он стал несовместим со сборками типа OberonCore и старыми версиями ББ, где остался старый вариант процедуры. Но проблема ли это? Ведь всегда можно взять свежую сборку. В CPfront кодовые процедуры транслируются в сишные дефайны, так что иметь лимит в 254 байта на длину тела процедуры ещё более бессмысленно, чем в ББ.

Вот смотрите, я на этой задаче тестил данный код: https://github.com/Oleg-N-Cher/OfrontPlus/issues/48

Но сейчас Ofront+ фичастее, в том смысле, что умеет объявлять внешние процедуры ещё и с разными моделями вызова. В CPfront так пока нельзя — он не пускает 2 системных флага сразу:

Код: "OBERON"
  1. PROCEDURE {code, callback} Abc ...

А в Ofront+ можно, только записывается вот так:

Код: "OBERON"
  1. PROCEDURE- [stdcall] Abc ...

Я думаю, нужно уходить от идента callback — он неинформативен, даже сбивает с толку.


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

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


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

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


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club