首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将变量从AngelScript传递到C++

将变量从AngelScript传递到C++
EN

Stack Overflow用户
提问于 2014-12-16 08:41:13
回答 1查看 941关注 0票数 0

我想将一个变量从AngelScript传递给C++。

我已经设法将函数从AngelScript传递给C++,反之亦然。

我也可以将变量从C++传递给AngelScript,但是我不知道如何进行相反的操作。

手册对我没有帮助,或者是我监督了那部分。

你能给我个提示吗?

编辑:

正如评论中提到的,我已经设法做到了。

在我的test.as文件中:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-15 03:28:05

这是我在运行您在做了一些小修改后发布的代码时的输出。

https://gyazo.com/cb264842efa76d153f9f5c0f962b391d

下面是添加小更改后的代码,我将解释我在后面添加了什么。

代码语言:javascript
复制
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;
}

我所要改变的就是我如何构建模块,因为您没有发布如何创建模块。如果你复制并粘贴我的东西,它就能完美地工作

代码语言:javascript
复制
    // 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);

现在我已经有了模块指针,所以在通过声明获取函数时可以直接使用它。

代码语言:javascript
复制
    // get function add from angelscript
    asIScriptFunction *func = mod->GetFunctionByDecl("int add(int, int)");

您定义多个函数的方式是正确的,以及它应该如何完成。我不知道你的问题到底在哪里,但我猜是你如何创建模块的,也许你用错误的名字加载了它。我希望这能帮上忙!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27500581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档