Нужна помощь C->PB

Раздел посвящен программированию с использованием Power Basic.
Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 15.03.2008 (Сб) 19:46

Спасибо, буду ждать с нетерпеньем.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.03.2008 (Вс) 21:24

Lapex писал(а):Из-за недостатка опыта работы с PB - я не могу создать корректный код аналогичный приведенному выше на С и FB.

FB?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 16.03.2008 (Вс) 22:09

FB - FreeBasic.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 16.03.2008 (Вс) 22:47

Lapex писал(а):Спасибо, буду ждать с нетерпеньем.


К своему неприятному удивлению, обнаружил остуствие этих исходников на моем рабочем компе. Если очень нужно, могу попробовать достать их с моей старой машины, но на это уйдет пара дней

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 16.03.2008 (Вс) 22:57

Очень нужно - буду ждать.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 16.03.2008 (Вс) 23:18

А пока можешь посмотреть как загружать DLL из памяти, из переменной или ресурсов

http://www.powerbasic.com/support/forum ... 01644.html

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 16.03.2008 (Вс) 23:23

А это утилита для "прошивания" бинарников в EXE/DLL файл.
Вложения
FILE2ASM.zip
(10.81 Кб) Скачиваний: 282

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 17.03.2008 (Пн) 0:08

А пока можешь посмотреть как загружать DLL из памяти, из переменной или ресурсов

Спасибо, это я уже смотрел..., но с примером линковки Lua.dll - мне было бы проще все переварить.
А это утилита для "прошивания" бинарников в EXE/DLL файл.
Спасибо, я уже пробывал ее - очень удобно, также помещал DLL в ресурс с помощью: LuaDLL RCDATA DISCARDABLE "Lua.dll".

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 17.03.2008 (Пн) 11:05

Вот нашел код. Это кусок стаба моего самодельного компилятора WinLua. Писал его 4 года назад и забросил. В оригинале байт-код Lua запускался из секции EXE файла, но сейчас переделал его для запуска из файла.
Пример полностью рабочий, можно вызывать из Lua скриптов функции описанные на PB. Файлы в архиве:

luaext.inc - функции PB для вызова из Lua скриптов
lualib.inc - прошитая Lua.dll версии 5.02
loader.inc - вызов функций статически слинкованной Lua.dll
LuaC.exe - компилятор Lua скриптов в байт-код
Test_script.lua - пример Lua скрипта с интегрированными PB функциями

Для иллюстрации примера надо запустить START.BAT
Вложения
LUA.zip
Lua
(170.97 Кб) Скачиваний: 272

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 17.03.2008 (Пн) 11:16

Спасибо, я уже пробывал ее - очень удобно, также помещал DLL в ресурс с помощью: LuaDLL RCDATA DISCARDABLE "Lua.dll


В ресурс я тоже помещал, но в последствии отказался от этого. Т.к. при этом лишние тормоза при загрузке Lua.dll в память. Рациональнее пользоваться утилитой FILE2ASM

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 17.03.2008 (Пн) 11:43

Большое спасибо за помощь.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 19.03.2008 (Ср) 18:12

Кстати, не подскажешь, зачем ты используешь LuaLib.dll? И вообще зачем нужна эта DLL?

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 19.03.2008 (Ср) 19:24

В принципе, можно обойтись и без нее, т.к. из LuaLib.dll используется только одна ф-ция luaL_openlib - для регистрации массива ф-ций в LUA. При такой регистрации, вызов ф-ции из LUA будет иметь формат: MyPlugin.MyFunction() - так требуют разработчики. Я попытался сделать альтернативу, используя только Lua.dll. Не знаю, может и не правильно, но работает :):
Код: Выделить всё
FUNCTION RegFuncs CDECL ALIAS "RegFuncs"(BYREF L AS LUA_STATE, LibMame AS ASCIIZ, FuncName AS ASCIIZ, BYVAL Func AS ASCIIZ PTR)  EXPORT AS LONG
  lua_pushstring(BYREF L, BYREF LibMame)
  lua_gettable(BYREF L, LUA_GLOBALSINDEX)
  IF (lua_isnil(BYREF L, -1)) THEN ' если таблица не найдена, то будет создана
    ' Pop nil from the stack
    lua_pop(BYREF L, 1)
    ' Создаем новую таблицу
    lua_newtable(BYREF L)    '/* create it */
    lua_pushvalue(BYREF L, -1)  '/* duplicate it */
    lua_setglobal(BYREF L, BYREF LibMame)
  END IF
    lua_pushstring(BYREF L, BYREF FuncName)   '/* Add function name. */
    LUA_PUSHCFUNCTION(BYREF L, Func)   '/* Add function pointer. */
    lua_settable(BYREF L, -3)
    lua_pop(BYREF L, 1)
    FUNCTION = 0
END FUNCTION
'-------------------------------------------------------------------------------
RegFuncs(L, "MyPlugin", "MyFunction", CODEPTR(MyFunction))
RegFuncs(L, "MyPlugin", "MyFunction1", CODEPTR(MyFunction1))

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 20.03.2008 (Чт) 10:28

Понятно. Решил вот тоже Lua вспомнить. Вполне нормальный скриптовый язык мне кажется ))

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 20.03.2008 (Чт) 12:28

Lapex - а ты обработку ошибок в скрипте делал? Ну чтобы PB ловил момент, когда в Lua скрипте произошла ошибка

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 20.03.2008 (Чт) 15:28

Нет, не делал. Мне от Lua нужно только несколько ф-ций, для привязки моего плагина...

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 30.03.2008 (Вс) 21:28

Уважаемый jangle, пожалуйста помоги с декларацией!

С декларацией обычных ф-ций - вроде разобрался:
Код: Выделить всё
DECLARE FUNCTION lua_type LUA_API LIB LUA_DLL ALIAS "lua_type"(BYVAL L AS LUA_STATE, _
BYVAL idx AS LONG) AS LONG

Делаю так:
Код: Выделить всё
GLOBAL zLua_Type AS DWORD

DECLARE FUNCTION Lua_Type (BYVAL L AS DWORD, BYVAL idx AS LONG) AS DWORD

FUNCTION Declare_Lua() AS DWORD
    CALL LoadPbDllFromMemory (FileData_Lua_dll, 64512&, hLua_DLL) ' загружаем Lua.dll
    zLua_Type = GetProcAddressDirectly  (hLua_DLL, "lua_type")
END FUNCTION

'----------------------------------------------------------------
' Вызов ф-ции
CALL DWORD zLua_Type USING Lua_Type (BYREF L, -1)

Не могу побороть макро ф-цию Lua_IsNil:
Код: Выделить всё
MACRO FUNCTION LUA_ISNIL(L,n)
END MACRO = (lua_type(L,n) = 0)

Подскажи пожалуйста, как ее переделать. Если можно, то поясни мне тупому смысл возвращаемого значения макро ф-ции, то что он возвращает результат ф-ции lua_type(L,n) - это я понял, но что означает сравнение с 0?
Последний раз редактировалось Lapex 30.03.2008 (Вс) 23:48, всего редактировалось 2 раз(а).

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 30.03.2008 (Вс) 21:59

Макрос - это не функция! Это просто подставляется исходный текст при компиляции, который был определен внутри макроса.

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 30.03.2008 (Вс) 22:11

Ну может, не так выразился, мне нужно сделать вызов LUA_ISNIL(L,n), а в таком виде макрос не будет работать. Как можно его переделать?

P.S. Если можно, то поясни мне тупому смысл возвращаемого значения макроса, то что он возвращает результат ф-ции lua_type(L,n) - это я понял, но что означает сравнение с 0?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 31.03.2008 (Пн) 0:26

Видимо, lua_type(L,n) возвращает номер типа.. А 0 возвращается, если переменная - nil...
Такое пояснение устроит?
label:
cli
jmp label

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 31.03.2008 (Пн) 9:23

Можно просто сделать обертку для lua_type, тогда и макрос менять не надо.



Код: Выделить всё
FUNCTION Lua_Type (BYVAL L AS DWORD, BYVAL idx AS LONG) AS DWORD
    CALL LoadPbDllFromMemory (FileData_Lua_dll, 64512&, hLua_DLL) ' загружаем Lua.dll
    zLua_Type = GetProcAddressDirectly  (hLua_DLL, "lua_type")
    CALL DWORD zLua_Type USING Lua_Type (BYREF L, -1)
END FUNCTION

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 31.03.2008 (Пн) 10:32

jangle
Спасибо большое - сделал почти так-же:

Код: Выделить всё
FUNCTION LUA_ISNIL (BYVAL L AS DWORD, BYVAL idx AS LONG) AS DWORD
  DIM res AS DWORD
  IF(hLua_DLL=0) THEN CALL LoadPbDllFromMemory (FileData_Lua_dll, 64512&, hLua_DLL) ' загружаем Lua.dll
  zLua_Type = GetProcAddressDirectly  (hLua_DLL, "lua_type")
  CALL DWORD zLua_Type USING Lua_Type (L, idx) TO res
  FUNCTION = res
END FUNCTION

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 31.03.2008 (Пн) 10:41

iGrok
А 0 возвращается, если переменная - nil...
Такое пояснение устроит?

Устроит, а что тогда вернет следующее?:
Код: Выделить всё
MACRO FUNCTION LUA_ISNONEORNIL(L,n)
END MACRO = (lua_type(L,n) <= 0)

P.S. Где можно почитать о такой форме записи?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 31.03.2008 (Пн) 10:44

P.S. Где можно почитать о такой форме записи


В хелпе

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 31.03.2008 (Пн) 11:02

Хелп я смотрю в первую очередь. Мне очень стыдно, но в нем я ничего нашел о возвращении результата со сравнением. Если не сложно, то ткни меня носом - буду очень благодарен.

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 31.03.2008 (Пн) 22:37

Вообщем информацию о возвращаемом результате со сравнением - я не нашел, но предполагаю следующее - это условие при котором ф-ция должна вернуть 1 (%TRUE).
Поправьте меня пожалуйста, если я ошибаюсь.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 01.04.2008 (Вт) 9:21

Зачем переписывать это макрос. Пускай остается как есть, только для lua_type обертку напиши

Lapex
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 25.02.2008 (Пн) 14:01

Сообщение Lapex » 01.04.2008 (Вт) 10:05

Я сделал обертки для всех Lua-ф-ций, которые используются в моем проекте - мне так удобнее. Уже все работает :).
Спасибо за помощь.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 01.04.2008 (Вт) 10:50

Кстати, если кому понадобятся хидеры для новой Lua 5.1 их можно скачать с форума Jose Roca

http://www.jose.it-berater.org/smfforum ... pic=1063.0

Однако внимание! В декларациях некоторый Lua функций есть ошибки!
Вложения
LUA51.zip
LUA v. 5.1.2 Headers for PowerBASIC
(76.45 Кб) Скачиваний: 276

Пред.

Вернуться в Power Basic

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

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

    TopList