OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 20 Январь, 2020 08:35

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




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: трансляция структуры из h файла
СообщениеДобавлено: Среда, 04 Октябрь, 2006 04:01 

Зарегистрирован: Четверг, 03 Август, 2006 06:09
Сообщения: 3
Пробую работать с библиотекой 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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
Долго вспоминал Це, потом понял, что это структура с полями - указателями на процедуры.
Код:
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


Последний раз редактировалось Илья Ермаков Пятница, 06 Октябрь, 2006 13:00, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 06 Октябрь, 2006 06:51 

Зарегистрирован: Четверг, 03 Август, 2006 06:09
Сообщения: 3
Спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 23 Апрель, 2007 22:22 

Зарегистрирован: Среда, 28 Февраль, 2007 00:08
Сообщения: 142
Откуда: Нижний Новгород
может, вместо INTEGER лучше вписывать SYSTEM.ADR?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 23 Апрель, 2007 22:45 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
В ББ нет типа SYSTEM.ADR. Есть процедура SYSTEM.ADR, возвращающая адрес объекта..

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 24 Апрель, 2007 09:26 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
Илья Ермаков писал(а):
Для адресов используется именно INTEGER (что не есть хорошо).
Зато отражает суть вопроса. Кто хочет писать системщину, должон знать.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 24 Апрель, 2007 09:59 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1229
А я обычно пишу 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;


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

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 236
Пытаюсь вызвать в ББ из 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 пока также ни к чему не привели.
Кто-нибудь может что-то посоветовать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: трансляция структуры из h файла
СообщениеДобавлено: Среда, 26 Ноябрь, 2008 09:22 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
Там нужно,видимо, правильно применить модификатор [ccall]. Только в 1.5 процедурные переменные, кажется, нельзя так объявлять. В 1.6 можно. Может, кто точнее посоветует.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: трансляция структуры из h файла
СообщениеДобавлено: Среда, 26 Ноябрь, 2008 10:21 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4539
Откуда: Россия, Орёл
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 экспортирует; например есть плагин для тотал командерского просмотровщика.


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

Зарегистрирован: Среда, 04 Июль, 2007 16:43
Сообщения: 236
Спасибо, теперь все работает. Мешало отсутствие модификатора [ccall].
Использовался BlackBox 1.6.


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

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
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-файл.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re:
СообщениеДобавлено: Среда, 23 Сентябрь, 2009 13:42 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3138
Откуда: Астрахань
Trurl писал(а):
А я обычно пишу ADDRESS = INTEGER и дальше использую ADDRESS.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: Среда, 23 Сентябрь, 2009 13:59 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8231
Откуда: Троицк, Москва
Валерий Лаптев писал(а):
Trurl писал(а):
А я обычно пишу ADDRESS = INTEGER и дальше использую ADDRESS.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: Среда, 23 Сентябрь, 2009 15:04 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Валерий Лаптев писал(а):
address и integer - совершенно разные типы данных.
Указатель с адресом не путайте. Адрес - это именно число.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: Среда, 23 Сентябрь, 2009 17:14 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3138
Откуда: Астрахань
Сергей Губанов писал(а):
Валерий Лаптев писал(а):
address и integer - совершенно разные типы данных.
Указатель с адресом не путайте. Адрес - это именно число.

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


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9170
Откуда: Россия, Орёл
Ну нет, адрес - это никак не указатель. Адрес - это адрес памяти, только и всего.
Указатель - это ссылка на объект, с гарантией существования и целостности этого объекта.


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3138
Откуда: Астрахань
Илья Ермаков писал(а):
Ну нет, адрес - это никак не указатель. Адрес - это адрес памяти, только и всего.
Указатель - это ссылка на объект, с гарантией существования и целостности этого объекта.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: Четверг, 24 Сентябрь, 2009 10:37 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Re:
СообщениеДобавлено: Четверг, 24 Сентябрь, 2009 11:41 

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

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


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

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


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

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


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

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