OberonCore

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

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




Начать новую тему Ответить на тему  [ Сообщений: 308 ]  На страницу Пред.  1 ... 12, 13, 14, 15, 16  След.
Автор Сообщение
СообщениеДобавлено: Понедельник, 17 Январь, 2022 00:24 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 482
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
Для связи с Windows Api хорошо работает такая конструкция:
Код:
PROCEDURE -GetModuleHandleA * (IN [nil] lpModuleName:ARRAY [untagged] OF SHORTCHAR): HMODULE "GetModuleHandleA(lpModuleName)";
Как-то BlackBox больше приучил к POINTER TO ARRAY [untagged], но почему бы и не просто ARRAY [untagged]?

GameHunter писал(а):
В чём может быть причина? Со старой версией ofront+'а программа успешно линкуется и исполняется.
Посмотрите в сторону ключика GCC -Wl,-e_WinMain@16 (для Win32) или -Wl,-eWinMain (для Win64). И возьмите обновлённый crt1.c


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 482
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
Код:
PROCEDURE -GetModuleHandleA * (IN [nil] lpModuleName:ARRAY [untagged] OF SHORTCHAR): HMODULE "GetModuleHandleA(lpModuleName)";
Обратите внимание, что это не единственный способ привязаться к внешней библиотеке. Модификатор PROCEDURE - (я предпочитаю писать PROCEDURE- , т.к. минус относится к типу процедуры, а не к имени) сгенерирует макрос #define Module_Proc Proc. Также Вам потребуется #include <библиотека.h>, который Вы подключаете через файл .h0, и фактически Вы просто макросом переадресовываете вызов на прототип, описанный в .h-файле библиотеки. Если в этом прототипе функции будут свои типы, характерные для Си, но несовместимые с оберонскими, то придётся делать преобразования. Иначе будут предупреждения при компиляции.

В Ofront'е+ в дополнение к этому есть и другой способ (смотрите модуль WinApi):
Код:
MODULE [foreign] MyExternLib;

PROCEDURE Proc * (parameter: Typ); (* Здесь не нужно никакого тела *)

PROCEDURE ОберонИмя * ["СиИмя"] (parameter: Typ);

END MyExternLib.

Здесь уже сгенерируется прототип __EXTERN MyExternLib_Proc (Typ parameter);
И #include <библиотека.h> не нужно, точки входа подставит сам линкер.

То есть, в случае способа 1 Вы используете готовые сишные хидеры библиотек, а при способе 2 Ofront+ генерит свой собственный хидер.


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

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

Изображение

Вы объявляете PROCEDURE -GetModuleHandleA, а такая процедура разворачивается в макрос, имеющий имя Module_GetModuleHandleA, а не просто GetModuleHandleA. В Ofront'е+ есть более удобный механизм определения прототипа внешней процедуры. Про это читайте постом выше. А макрос немного для других, менее тривиальных применений.

И раз Вы описываете процедуру так, как описываете, то у Вас генерится такой Си-код:

Код:
#define Win_GetModuleHandleA(lpModuleName)  GetModuleHandleA(lpModuleName)

static void Win_Example (void)
{
  if (Win_GetModuleHandleA(NIL) == NIL) {
  }
}
Здесь у меня нет никаких идей, кроме такой: GetModuleHandleA считается необъявленной функцией. А в Си такая необъявленная функция работает по умолчанию с параметрами типа int. И наверное с результатом типа int. Вот поэтому Вы и имеете сравнение результата неявного типа int с явным NIL, который описан в SYSTEM.oh как ((void*)0)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Январь, 2022 20:14 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 203
Откуда: Питер
Получилось слинковать и запустить программу. Надо было, как вы и советовали, использовать и crt1.c, и ключ линкеру gcc.

Необходимость включать в проект ваш crt1.c вызывает вопрос - зачем, собственно, так сделано? Ведь наверное не все компиляторы си содержат по умолчанию ваш crt1.c (например моя версия gcc :)? Если это необходимо, то, наверное, имеет смысл включить этот файл в oFront+?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 17 Январь, 2022 20:58 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 203
Откуда: Питер
Поправка. По своей рассеянности я раньше не замечал, что crt1.c уже включён в oFront+. По этому мои предыдущие замечания снимаются. В старых версиях oFront+'а я успешно компилировал свой проект без этого файла. В последней версии oFront+'а файл crt1.c необходимо сключать в проект. При этом, если использовать crt1.c из oFront+'а, то программа не завершается. А если использовать обновлённый crt1.cб то - завершается.


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 482
Откуда: Украина, Днепропетровская обл.
GameHunter писал(а):
Необходимость включать в проект ваш crt1.c вызывает вопрос - зачем, собственно, так сделано?
Издавна ещё со времён ретро-платформ у меня есть привычка добиваться компактности. Создайте в GCC пустой исполняемый файл и посмотрите зависимости. Он потянет из msvcrt.dll целую кучу функций, в т.ч. нужных для поддержки C++ (которая нам не нужна). И посмотрите размер. Он будет > 20-30 Кб в зависимости от версии GCC.

В сети есть советы как уменьшить размер исполняемого файла путём вырезания из него этих зависимостей. Так мы можем получить .exe размером 1-1,5 Кб для пустой программы.

Но если есть желание избавиться от crt1.c, просто уберите опции, заданные в StripExe:
Цитата:
SET StripExe=-nostartfiles ..\..\..\Mod\Lib\crt1.c -Wl,-e_WinMain@16

GameHunter писал(а):
При этом, если использовать crt1.c из oFront+'а, то программа не завершается. А если использовать обновлённый crt1.cб то - завершается.
Обновите Ofront+, уже добавлен новый crt1.c, всё протестировано и работает. Просто я изменил механизм работы с командной строкой под Windows, отсюда побочкой возникла эти проблема.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 19 Январь, 2022 07:31 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 203
Откуда: Питер
Следующая ошибка.

Этот модуль транслируется в си, но при дальнейшей компиляции вылаёт ошибку.
Код:
MODULE Ex;

TYPE
  R0 = EXTENSIBLE RECORD
    x:REAL;
  END;
 
  R1 = EXTENSIBLE RECORD (R0)
    y:REAL;
  END;

  R2 = R1;
 
  R3 = EXTENSIBLE RECORD (R2)
    z:REAL;
  END;
 
PROCEDURE Example (VAR r:R0);
  BEGIN
    WITH r:R1 DO
      r.y:=0
    | r:R2 DO
      r.y:=0
    | r:R3 DO
      r.z:=0
    ELSE
      r.x:=0
    END;
  END Example;
 
END Ex.


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 482
Откуда: Украина, Днепропетровская обл.
Это унаследованная проблема, она есть также в Ofront, voc и CPfront. И в МультиОбероне.

Пока думаю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Январь, 2022 18:59 
Аватара пользователя

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

GameHunter, благодарю! Судя по всему, Вы кодите что-то нетривиальное на Обероне, раз вскрываете такие редкие ошибки, которые не возникли даже при трансляции в Си модулей BlackBox.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 01 Февраль, 2022 02:13 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 203
Откуда: Питер
Следующая ошибка.

Этот модуль успешно транстируется в си, но потом выдаёт ошибку компиляции gcc:

Код:
MODULE Test;

TYPE
  Arr = ARRAY OF ARRAY 4 OF INTEGER;

PROCEDURE Ex ( VAR a: Arr );
  BEGIN
    a[0,1]:= -1
  END Ex;

END Test.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 02 Февраль, 2022 04:38 
Аватара пользователя

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

Кстати, ошибка унаследованная — присутствует в Ofront и CPfront. И, видимо, в Мульти-Обероне тоже.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Февраль, 2022 19:27 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 203
Откуда: Питер
Следующее замечание. Данный модуль успешно транслируется в си и затем успещно компилируется, но с какими-то подозрительными предупреждениями. Посмотрите пожалуйста, всё ли в порядке.

Код:
MODULE Ex;

TYPE
  FixedArr = ARRAY 5 OF INTEGER;

PROCEDURE Ex0 ( VAR a: INTEGER );
END Ex0;

PROCEDURE Ex3 ( VAR a: ARRAY OF FixedArr );
  BEGIN
    Ex0 ( a[ 0, 0 ] );
  END Ex3;

END Ex.


Вложение:
Image1.png
Image1.png [ 52.41 КБ | Просмотров: 1023 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 03 Февраль, 2022 19:32 

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

Код:
MODULE Ex;

TYPE
  FixedArray = ARRAY 5 OF INTEGER;

PROCEDURE Ex3 ( VAR a: ARRAY OF FixedArray );
  BEGIN
    a[ 0, 0 ] := a[ 0, 0 ] + 1;
  END Ex3;

END Ex.


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

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

Новое исправление. Протестируйте, пожалуйста, его хорошенько с многомерными массивами. Я прогнал некоторые тесты для двухмерных массивов, вроде всё работает.

К моему большому сожалению, Йозеф Темпл совсем забросил Ofront, а он понимает его многие тонкости куда лучше меня.


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 07 Февраль, 2022 03:39 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 203
Откуда: Питер
В офронте можно объявлять строковые константы в каком-нибудь юникоде? Нидеприведённый модуль, если использовать utf-8, компилируется, но выводит на экран кракозябрв вместо русских и немецких букв.

Код:
MODULE Ex;

IMPORT
  Console;

BEGIN
  Console.String('asdf йцук üöäß'); Console.Ln; Console.Flush;
END Ex.


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 482
Откуда: Украина, Днепропетровская обл.
Можно. Ключик -w (wide) включает перекодировку исходника из UTF-8 в UCS-2 (двухбайтовую кодировку широких символов в Windows).

Насчёт проблемы - обдумываем с Йозефом. Вернее, Йозеф думает, я жду ;-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 23 Февраль, 2022 17:40 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 482
Откуда: Украина, Днепропетровская обл.
Ну что ж, Йозеф совсем зашился, придётся самим.

Осторожно выкатываю решение для замеченной проблемы. В принципе, не должен бы что-то сломать, но тестируйте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 12 Март, 2022 00:59 

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

Цитата:
MODULE Test;

TYPE
Rec0 * = RECORD
END;
Arr0 = ARRAY 4 OF Rec0;

PROCEDURE (VAR r:Rec0) Ex (VAR a:Arr0), NEW;
BEGIN
END Ex;

END Test.


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

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 482
Откуда: Украина, Днепропетровская обл.
Эта проблема связана с тем, что на момент определения массива Arr0 тип записи Rec0 ещё недоопределён. Если поменять порядок определений, будет та же самая проблема:

Код:
TYPE
   Arr0 = ARRAY 4 OF Rec0;
   Rec0 * = RECORD
   END;

Эта ошибка также присутствует в CPfront и в Мульти-Обероне. В Ofront и voc её нет, там такой код просто вызовет ошибку рекурсивного определения.

Я прошу помощи у Дмитрия Викторовича Дагаева, если ему ещё интересна доработка Мульти-Оберона. Тем более, что он уже патчил код, связанный с рекурсивным определением типов.


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

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


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

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


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

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