OberonCore
https://forum.oberoncore.ru/

трансляция структуры из h файла
https://forum.oberoncore.ru/viewtopic.php?f=2&t=314
Страница 1 из 2

Автор:  s.penkov [ Среда, 04 Октябрь, 2006 04:01 ]
Заголовок сообщения:  трансляция структуры из h файла

Пробую работать с библиотекой SDL (http://www.libsdl.org)
Помогите перевести вот такую структуру:

Код:
typedef struct SDL_RWops {
   /* Seek to 'offset' relative to whence, one of stdio's whence values:
      SEEK_SET, SEEK_CUR, SEEK_END
      Returns the final offset in the data source.
    */
   int (SDLCALL *seek)(struct SDL_RWops *context, int offset, int whence);

   /* Read up to 'num' objects each of size 'objsize' from the data
      source to the area pointed at by 'ptr'.
      Returns the number of objects read, or -1 if the read failed.
    */
   int (SDLCALL *read)(struct SDL_RWops *context, void *ptr, int size, int maxnum);

   /* Write exactly 'num' objects each of size 'objsize' from the area
      pointed at by 'ptr' to data source.
      Returns 'num', or -1 if the write failed.
    */
   int (SDLCALL *write)(struct SDL_RWops *context, const void *ptr, int size, int num);

   /* Close and free an allocated SDL_FSops structure */
   int (SDLCALL *close)(struct SDL_RWops *context);

   Uint32 type;
   union {
#ifdef __WIN32__
       struct {
      int    append;
      void*  h;
       } win32io;
#endif
#ifdef HAVE_STDIO_H
       struct {
      int autoclose;
      FILE *fp;
       } stdio;
#endif
       struct {
      Uint8 *base;
      Uint8 *here;
      Uint8 *stop;
       } mem;
       struct {
      void *data1;
       } unknown;
   } hidden;

} SDL_RWops;


И общий вопрос: может быть всё-таки кто-нибудь из знатоков возьмётся и напишет транслятор заголовочных файлов С. А то как-то обидно: у XDS есть, у freepascal есть, а у нас нет. :)

Автор:  Илья Ермаков [ Среда, 04 Октябрь, 2006 13:47 ]
Заголовок сообщения: 

Долго вспоминал Це, потом понял, что это структура с полями - указателями на процедуры.
Код:
IMPORT SYSTEM;

TYPE
SDL_RWops = RECORD [untagged]
  seek: PROCEDURE (context: POINTER TO SDL_RWops; ptr: INTEGER (*и передавать SYSTEM.ADR *); size, maxnum: INTEGER);
  write: PROCEDURE (context: POINTER TO SDL_RWops; ptr: INTEGER; size, num: INTEGER);
  type: INTEGER;
  (* WIN32 *)
  hidden: RECORD [union]
     win32io: RECORD append: INTEGER; h: INTEGER END;
     stdio: RECORD autoclose: INTEGER; fp: INTEGER END;
     mem: RECORD base, here, stop: INTEGER END;
     unknown: RECORD data1: INTEGER END
  END
END

Автор:  s.penkov [ Пятница, 06 Октябрь, 2006 06:51 ]
Заголовок сообщения: 

Спасибо!

Автор:  batyrmastyr [ Понедельник, 23 Апрель, 2007 22:22 ]
Заголовок сообщения: 

может, вместо INTEGER лучше вписывать SYSTEM.ADR?

Автор:  Илья Ермаков [ Понедельник, 23 Апрель, 2007 22:45 ]
Заголовок сообщения: 

В ББ нет типа SYSTEM.ADR. Есть процедура SYSTEM.ADR, возвращающая адрес объекта..

Для адресов используется именно INTEGER (что не есть хорошо).

Есть тип SYSTEM.PTR - это общий указатель, который может указывать на любой динамический объект (ANYPTR + POINTER TO ARRAY). Полезный тип, на нем в SP4 написана Mem.SetLength...

Автор:  Евгений Темиргалеев [ Вторник, 24 Апрель, 2007 09:26 ]
Заголовок сообщения: 

Илья Ермаков писал(а):
Для адресов используется именно INTEGER (что не есть хорошо).
Зато отражает суть вопроса. Кто хочет писать системщину, должон знать.

Особо баловаться этим делом смысла нету. А когда идет речь про то место, где нужно, так все равно если модель коренным образом меняется - все это" место" целиком переписывать. И более оптимально оно будет переписано напрямую, без всяких обобщающих типов. Может в этом и есть смысл?

Автор:  Trurl [ Вторник, 24 Апрель, 2007 09:59 ]
Заголовок сообщения: 

А я обычно пишу ADDRESS = INTEGER и дальше использую ADDRESS. Например, так
Код:
TYPE
  ADDRESS = INTEGER;
  PtrUint8 = POINTER TO ARRAY [untagged] OF SHORTCHAR;

  SDL_RWops = RECORD [untagged]
    seek  : PROCEDURE ( VAR context: SDL_RWops; offset, whence: INTEGER): INTEGER;
    read  : PROCEDURE ( VAR context: SDL_RWops; ptr: ADDRESS; size, maxnum:INTEGER ): INTEGER;
    write : PROCEDURE ( VAR context: SDL_RWops; ptr: ADDRESS; size, num: INTEGER ): INTEGER;
    close : PROCEDURE ( VAR context: SDL_RWops): INTEGER;
    type  : INTEGER;
    hidden:  RECORD [union]
      win32io: RECORD append: INTEGER; h : ADDRESS END;
      stdio  : RECORD autoclose: INTEGER; fp : ADDRESS END;
      mem    : RECORD base, here, stop: PtrUint8 END;
      unknown: RECORD data1: ADDRESS END;
    END;
  END;

Автор:  QWERTYProgrammer [ Среда, 26 Ноябрь, 2008 01:16 ]
Заголовок сообщения:  Re: трансляция структуры из h файла

Пытаюсь вызвать в ББ из dll функцию, у которой параметр указатель на функцию, т.е. исходно в dll есть

Цитата:
typedef double (* ptr2func) (double);

double Funcres(ptr2func f, double a) {
return f(a);
}


В ББ интерфейс описан как
Код:
 ptr2func* = PROCEDURE ( x: REAL ): REAL;
PROCEDURE  Funcres* ["Funcres"] ( f: ptr2func; a: REAL ): REAL;


При попытке вызвать Funcres, например,
Код:
...
PROCEDURE f(x: REAL): REAL;
      VAR 
   BEGIN
      RETURN  x*x*x*x;
   END f;
...
z:= TestInterface.Funcres(f, 2.0);

выскакивает трап NIL procedure call.
Попытки использовать SYSTEM.ADR, SYSTEM.VAL пока также ни к чему не привели.
Кто-нибудь может что-то посоветовать?

Автор:  Илья Ермаков [ Среда, 26 Ноябрь, 2008 09:22 ]
Заголовок сообщения:  Re: трансляция структуры из h файла

Там нужно,видимо, правильно применить модификатор [ccall]. Только в 1.5 процедурные переменные, кажется, нельзя так объявлять. В 1.6 можно. Может, кто точнее посоветует.

Автор:  Евгений Темиргалеев [ Среда, 26 Ноябрь, 2008 10:21 ]
Заголовок сообщения:  Re: трансляция структуры из h файла

1) Соглашение о вызове "Си" для ptr2func.
Код:
ptr2func* = PROCEDURE [call] ( x: REAL ): REAL;
PROCEDURE  Funcres* ["Funcres"] ( f: ptr2func; a: REAL ): REAL;
Можно сразу
Код:
PROCEDURE  Funcres* ["Funcres"] ( f: PROCEDURE [call] ( x: REAL ): REAL; a: REAL ): REAL;
Код:
PROCEDURE [call] f(x: REAL): REAL;
  VAR
BEGIN
  RETURN  x*x*x*x;
END f;

В ББ 1.5 приходится убирать [ccall] из процедурного типа:
Код:
PROCEDURE  Funcres* ["Funcres"] ( f: PROCEDURE ( x: REAL ): REAL; a: REAL ): REAL;
Код:
PROCEDURE [call] f(x: REAL): REAL;
...
Столкнулся с этим при портировании glut.h, можете поглядеть как сделано; см. в Зиновской коллекции OglGlut

2) Если я не ошибаюсь, то все экспортированные DLL-процедуры д. использовать соглашение о вызове stdcall. Вроде
Код:
double __stdcall Funcres(ptr2func f, double a)...
У Вас этого нету и, мне кажется, что Вы забыли эту процедуру экспортировать. Оттуда и лезет "NIL procedure call". Просмотрите, что Ваша dll экспортирует; например есть плагин для тотал командерского просмотровщика.

Автор:  QWERTYProgrammer [ Среда, 26 Ноябрь, 2008 22:47 ]
Заголовок сообщения:  Re: трансляция структуры из h файла

Спасибо, теперь все работает. Мешало отсутствие модификатора [ccall].
Использовался BlackBox 1.6.

Автор:  id_ler [ Понедельник, 21 Сентябрь, 2009 11:50 ]
Заголовок сообщения:  Re: трансляция структуры из h файла

SDL (Simple DirectMedia Layer)- кроссплатформеная библиотека для создания игр и эмуляторов. Здесь http://plg.lrn.ru/doc/sdl/index.html находится русскоязычное руководство для начинающих. Здесь http://www.libsdl.org/languages.php привязка библиотеки к различным языкам (FreePascal, Ada и другие). Я скачал себе FreePascal-версию и пытаюсь переписать её в подсистему Windows-версии BlackBox’а для использования в Linux. Цель: написать эмулятор и запускать BlackBox в различных системах без изменений в исходных текстах. Для решения этой задачи требуется:
1.Оконная среда исполнения в Linux;
2.Управление памятью;
3.Работа с файлами.
Если я правильно понимаю, SDL решает только первую задачу. Я рассчитываю на использование BlackBox’а скомпонованного в dll-файл.

Автор:  Валерий Лаптев [ Среда, 23 Сентябрь, 2009 13:42 ]
Заголовок сообщения:  Re:

Trurl писал(а):
А я обычно пишу ADDRESS = INTEGER и дальше использую ADDRESS.

К сожалению, это не одно и то же. И сути, как сказал Евгений, как раз не отражает.
address и integer - совершенно разные типы данных.
Тут, к сожалению, в КП дырка.

Автор:  Info21 [ Среда, 23 Сентябрь, 2009 13:59 ]
Заголовок сообщения:  Re: Re:

Валерий Лаптев писал(а):
Trurl писал(а):
А я обычно пишу ADDRESS = INTEGER и дальше использую ADDRESS.

К сожалению, это не одно и то же. И сути, как сказал Евгений, как раз не отражает.
address и integer - совершенно разные типы данных.
Тут, к сожалению, в КП дырка.
Не надо, это не дырка.

Автор:  Сергей Губанов [ Среда, 23 Сентябрь, 2009 15:04 ]
Заголовок сообщения:  Re: Re:

Валерий Лаптев писал(а):
address и integer - совершенно разные типы данных.
Указатель с адресом не путайте. Адрес - это именно число.

Автор:  Валерий Лаптев [ Среда, 23 Сентябрь, 2009 17:14 ]
Заголовок сообщения:  Re: Re:

Сергей Губанов писал(а):
Валерий Лаптев писал(а):
address и integer - совершенно разные типы данных.
Указатель с адресом не путайте. Адрес - это именно число.

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

Автор:  Илья Ермаков [ Среда, 23 Сентябрь, 2009 17:18 ]
Заголовок сообщения:  Re: трансляция структуры из h файла

Ну нет, адрес - это никак не указатель. Адрес - это адрес памяти, только и всего.
Указатель - это ссылка на объект, с гарантией существования и целостности этого объекта.

Автор:  Валерий Лаптев [ Среда, 23 Сентябрь, 2009 17:23 ]
Заголовок сообщения:  Re: трансляция структуры из h файла

Илья Ермаков писал(а):
Ну нет, адрес - это никак не указатель. Адрес - это адрес памяти, только и всего.
Указатель - это ссылка на объект, с гарантией существования и целостности этого объекта.

Ну, да, в КП - именно так. Отдельного типа указатель нет. Это - хорошо и правильно.
Но вот путать программеров, что адрес = целое - это не есть хорошо.

Автор:  Сергей Губанов [ Четверг, 24 Сентябрь, 2009 10:37 ]
Заголовок сообщения:  Re: Re:

Валерий Лаптев писал(а):
Адрес - это значение переменной типа указатель.
Не верно. Вы указатель с адресом путаете. Адрес -- это число, а значение указателя -- тело объекта на которое он указывает. У указателя как объекта тоже есть тело, внутри этого тела хранится адрес объекта на который он указывает.
Валерий Лаптев писал(а):
Ну, да, в КП - именно так. Отдельного типа указатель нет.
Есть: POINTER TO ... и ANYPTR = POINTER TO ANYREC.

Автор:  Валерий Лаптев [ Четверг, 24 Сентябрь, 2009 11:41 ]
Заголовок сообщения:  Re: Re:

Сергей Губанов писал(а):
Валерий Лаптев писал(а):
Адрес - это значение переменной типа указатель.
Не верно. Вы указатель с адресом путаете. Адрес -- это число, а значение указателя -- тело объекта на которое он указывает. У указателя как объекта тоже есть тело, внутри этого тела хранится адрес объекта на который он указывает.
Валерий Лаптев писал(а):
Ну, да, в КП - именно так. Отдельного типа указатель нет.
Есть: POINTER TO ... и ANYPTR = POINTER TO ANYREC.

1. С указателями в КП я еще не совсем разобрался. А в С++ указатель - это переменная, которая может иметь значение, а может не имет. Значением переменной типа указатель является адрес. Если адрес выводить для представления человеку, то естественно - это целое число. А как с типом данных с указателями в С/С++ можно делать только определенные операции, отнюдь не все, что с целыми числами.
2. Далее начинаются стратегии владения динамическим объектом (тело, на которое указывает указатель). Встроенный указатель в С/С++ - низкоуровневая конструкция, поэтому он объектом никак не владеет. Для устранения этого недостатка создаются различные виды интеллектуальных указателей с разной стратегией владения динамическим объектом. Об этом много написано в книге у Элджера. Можно и у Александреску тоже найти материал по этой теме.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/