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/ |