crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Использование QtScript
faustin
  опции профиля:
сообщение 9.3.2012, 1:17
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 9.3.2012
Пользователь №: 3253

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, есть библиотека для вызова вызова нативных функций из ПО вызывается примерно таким методом:
Player playerIndex = Natives::ConvertIntToPlayerIndex(Natives::GetPlayerId());
Natives::AddScore(playerIndex, 1000);


так же существует хранилище с нативами их около 3000
namespace Natives
{
static void AddScore(Player playerIndex, int score) { NativeInvoke::Invoke<NATIVE_ADD_SCORE, ScriptVoid>(playerIndex, score); }
...
}

Так как постоянно компилировать огромное количества кода не есть гуд понадобилось использование скриптов с доступом ко всем нативным функциям....
Не подскажите как под это дело прикрутить QtScript?
Заранее спасибо!


Здравствуйте, есть библиотека для вызова вызова нативных функций из ПО вызывается примерно таким методом:
Player playerIndex = Natives::ConvertIntToPlayerIndex(Natives::GetPlayerId());
Natives::AddScore(playerIndex, 1000);


так же существует хранилище с нативами их около 3000
namespace Natives
{
static void AddScore(Player playerIndex, int score) { NativeInvoke::Invoke<NATIVE_ADD_SCORE, ScriptVoid>(playerIndex, score); }
...
}

Так как постоянно компилировать огромное количества кода не есть гуд понадобилось использование скриптов с доступом ко всем нативным функциям....
Не подскажите как под это дело прикрутить QtScript?
Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 12.3.2012, 8:56
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


Если не смущает описать врапер на каждую функцию, то могу предложить такой вариант:

enum FuncName
{
   Func_AddScore, ....
};

struct FuncInfo
{
  
   int ArgumentsCount;
   FuncName Name;

   FuncInfo( int a, FuncName n ):ArgumentsCount(a),Name(n){}
};

QHash<QString,int> functionArguments;
functionArguments["AddScore", FuncInfo(1,Func_AddScore)];
...
...

QScriptValue NativesCaller(QScriptContext* c, QScriptEngine *engine)
{
   // Первый аргумент - имя вызываемой функции
   QString funcName = context->argument(0).toString();

   if( !functionArguments.contains(funcName) )
   {
         // Если не найдена вызываемая функция, бросаем исключение
         return c->throwError( QString("No such function %0").arg(funcName) );
   }

   FuncInfo inf = functionArguments[funcName];
   if( inf.ArgumentsCount != c->argumentsCount()-1 )
   {
        // Если не совпадает кол-во аргументов для функции, бросаем исключение
        return c->throwError( "arguments count mismatch" );
   }

   QScriptValue retVal;
   switch( inf.FuncName )
   {
   case Func_AddScore:
        {
            int score = c->argument(1).toNumber();
            Player playerIndex = Natives::ConvertIntToPlayerIndex(Natives::GetPlayerId());
            Natives::AddScore(playerIndex, 1000);
            break;
        }
   }

   return retVal;
}

....
// Регистрация функции в скриптах
// myEngine имеет тип QStringEngine
QScriptValue fun = myEngine.newObject(NativesCaller);
myEngine.globalObject().setProperty("NativesCaller",fun);


// Работа с функцией в скрипте
try
{
   NativesCaller( "AddScore", 1000 );
}
catch( e )
{
  alert( e.description );
}


Сообщение отредактировал PAFOS - 12.3.2012, 8:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
faustin
  опции профиля:
сообщение 12.3.2012, 23:43
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 9.3.2012
Пользователь №: 3253

Спасибо сказали: 0 раз(а)




Репутация:   0  


Большое спасибо!
Только вот при компиляции выдает ошибку в троке:
functionArguments["AddScore", FuncInfo(1,Func_AddScore)];

такого содержания:
C2143:синтаксическая ошибка : отсутствие "]" перед ","
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 13.3.2012, 7:52
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


ну да, все правильно))

functionArguments["AddScore"] = FuncInfo(1,Func_AddScore);


вот так надо)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
faustin
  опции профиля:
сообщение 13.3.2012, 9:59
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 9.3.2012
Пользователь №: 3253

Спасибо сказали: 0 раз(а)




Репутация:   0  


Большое спасибо!
Ахаха я чета сразу и не догнал)))... Все побежал пробовать!

Теперь по этой же строчки вышел ряд ошибок:
C2057: требуется константное выражение
C2466: невозможно выделить память для массива постоянного нулевого размер
C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
C2040: functionArguments: "int []" отличается по уровням косвенного обращения от "QHash<Key,T>"
with
[
    Key=QString,
    T=int
]
C2440: инициализация: невозможно преобразовать "FuncInfo" в "int []"
Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PAFOS
  опции профиля:
сообщение 13.3.2012, 10:14
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 258
Регистрация: 27.12.2010
Из: Дмитров
Пользователь №: 2309

Спасибо сказали: 29 раз(а)




Репутация:   8  


QHash<QString,FuncInfo> functionArguments;


Товарищ! Будьте внимательнее)) Я пример привел не проверяя его на компилябельность, так что там еще может быть много мин).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 11:59