Передача переменных из AngelScript в переполнение стека

Я хочу передать переменную из AngelScript в C ++.
Мне уже удалось передать функции из AngelScript в C ++ и наоборот.
Я также могу передавать переменные из C ++ в AngelScript, однако я не могу понять, как это сделать наоборот.
Руководство не помогло мне, или я следил за этой частью.
Можете ли вы дать мне подсказку?

Редактировать:

Как уже упоминалось в комментарии, вот что мне уже удалось сделать.

в моем файле test.as:

int add(int a, int b)
{
print("Hello World, I'm AngelScript\n");
multi(5, 13);
print("c is " + c + "\n");
return (a + b);
}

мой файл test.cpp:

int multi(int x, int y)
{
int z = x * y;
cout << "x aus dem Skript: " << x << endl;
cout << "y aus dem Skript: " << y << endl;
printf("Ergebnis von multi x * y: %d\n", z);
return z;
}

void print(string &msg)
{
printf("%s", msg.c_str());
}

int _tmain(int argc, _TCHAR* argv[])
{
int r;
int c = 42;

asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);

RegisterStdString(engine);

// pass function print to angelscript
r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert(r >= 0);
// pass function multi to angelscript
r = engine->RegisterGlobalFunction("int multi(int, int)", asFUNCTION(multi), asCALL_CDECL); assert(r >= 0);
// pass variable c to angelscript
r = engine->RegisterGlobalProperty("int c", &c); assert(r >= 0);

FILE *f = fopen("test.as", "rb");

fseek(f, 0, SEEK_END);
int len = ftell(f);
fseek(f, 0, SEEK_SET);

string script;
script.resize(len);
fread(&script[0], len, 1, f);

fclose(f);

mod->AddScriptSection("script", &script[0], len);
mod->Build();

asIScriptContext *ctx = engine->CreateContext();

// get function add from angelscript
asIScriptFunction *func = engine->GetModule("test.as")->GetFunctionByDecl("int add(int, int)");

ctx->Prepare(func);
ctx->SetArgDWord(0, 7);
ctx->SetArgDWord(1, 20);

if (ctx->Execute() == asEXECUTION_FINISHED)
{
asDWORD returnValue = ctx->GetReturnDWord();
cout << "Result of a + b is: " << returnValue << endl;
}

ctx->Release();
engine->Release();

return 0;
}

0

Решение

Вот мой вывод, когда я запускаю код, который вы опубликовали после нескольких небольших изменений.

https://gyazo.com/cb264842efa76d153f9f5c0f962b391d

Вот код после добавления небольших изменений, я объясню, что я добавил после.

int multi(int x, int y)
{
int z = x * y;
cout << "x aus dem Skript: " << x << endl;
cout << "y aus dem Skript: " << y << endl;
printf("Ergebnis von multi x * y: %d\n", z);
return z;
}

void print(string &msg)
{
printf("%s", msg.c_str());
}

int _tmain(int argc, _TCHAR* argv[])
{
int r;
int c = 42;

asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION);

RegisterStdString(engine);

// pass function print to angelscript
r = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert(r >= 0);
// pass function multi to angelscript
r = engine->RegisterGlobalFunction("int multi(int, int)", asFUNCTION(multi), asCALL_CDECL); assert(r >= 0);
// pass variable c to angelscript
r = engine->RegisterGlobalProperty("int c", &c); assert(r >= 0);

FILE *f = fopen("test.as", "rb");

fseek(f, 0, SEEK_END);
int len = ftell(f);
fseek(f, 0, SEEK_SET);

string script;
script.resize(len);
fread(&script[0], len, 1, f);

fclose(f);

// create our module and add our script section to it then build!
asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE);
r = mod->AddScriptSection("script", &script[0], len); assert(r >= 0);
r = mod->Build(); assert(r >= 0);

asIScriptContext *ctx = engine->CreateContext();

// get function add from angelscript
asIScriptFunction *func = mod->GetFunctionByDecl("int add(int, int)");

ctx->Prepare(func);
ctx->SetArgDWord(0, 7);
ctx->SetArgDWord(1, 20);

if (ctx->Execute() == asEXECUTION_FINISHED)
{
asDWORD returnValue = ctx->GetReturnDWord();
cout << "Result of a + b is: " << returnValue << endl;
}

ctx->Release();
engine->Release();

return 0;
}

Все, что мне пришлось изменить, — это то, как я построил модуль, так как вы не опубликовали, как вы создали модуль. Если вы скопируете и вставите то, что у меня получилось, то отлично

    // create our module and add our script section to it then build!
asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE);
r = mod->AddScriptSection("script", &script[0], len); assert(r >= 0);
r = mod->Build(); assert(r >= 0);

Также теперь, когда у меня был указатель на модуль, я мог использовать его непосредственно при получении функции по объявлению

    // get function add from angelscript
asIScriptFunction *func = mod->GetFunctionByDecl("int add(int, int)");

То, как вы определили мультифункцию, было правильным и как это должно быть сделано. Я не уверен, где именно ваша проблема, но я думаю, это было то, как вы создали модуль и, возможно, вы загрузили его с неправильным именем. Надеюсь, это поможет!

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector