Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;“如何制作lua”;“作家”;_C++_C_Compilation_Lua_Bytecode - Fatal编程技术网

C++ C++;“如何制作lua”;“作家”;

C++ C++;“如何制作lua”;“作家”;,c++,c,compilation,lua,bytecode,C++,C,Compilation,Lua,Bytecode,我试图制作一个系统,用于在内存中存储lua编译的脚本。 问题是我无法生成“lua_Writer”,并且变量字节码是空的。我正在使用Luajit。 下面是我的代码 typedef struct { size_t *len; char **data; } BS_DESCRIP; int scriptMemoryWriter(lua_State* ls, const void* p, size_t sz, void* ud) { BS_DESCRIP* bd = (BS_DE

我试图制作一个系统,用于在内存中存储lua编译的脚本。 问题是我无法生成“lua_Writer”,并且变量字节码是空的。我正在使用Luajit。 下面是我的代码

typedef struct {
    size_t *len;
    char **data;
} BS_DESCRIP;

int scriptMemoryWriter(lua_State* ls, const void* p, size_t sz, void* ud)
{
    BS_DESCRIP* bd = (BS_DESCRIP*)ud;
    char* newData; = (char*)realloc(*(bd->data), (*(bd->len)) + sz);

    if(newData)
    {
        memcpy(newData + (*(bd->len)), p, sz);
        *(bd->data) = newData;
        *(bd->len) += sz;

    } else {
        free(newData);

        return 1;
    }

    return 0;
}

void HScriptManager::compileToMemory(HScript* script)
{
    char* bytecode = 0L;
    size_t bytecode_len = 0;
    BS_DESCRIP bd = {&bytecode_len, &bytecode};

    int buff_ret = luaL_loadbuffer(m_pLuaState, script->getData().c_str(), script->getBuffSize(), script->getName().c_str());
    int comp_ret = lua_dump(m_pLuaState, scriptMemoryWriter, &bd);

    lua_pop(m_pLuaState, 1);

    std::cout << "bytecode_len: " << bytecode_len << std::endl;
    std::cout << "bytecode: " << bytecode << std::endl;

    std::cout << "buff_ret: " << buff_ret << std::endl;
    std::cout << "comp_ret: " << comp_ret << std::endl;
}
typedef结构{
尺寸×长度;
字符**数据;
}b_descripp;
int scriptMemoryWriter(lua_State*ls,const void*p,size_t sz,void*ud)
{
b_descripp*bd=(b_descripp*)ud;
char*newData;=(char*)realloc(*(bd->data),(*(bd->len))+sz;
如果(新数据)
{
memcpy(newData+(*(bd->len)),p,sz);
*(bd->data)=新数据;
*(bd->len)+=sz;
}否则{
免费(新数据);
返回1;
}
返回0;
}
void HScript管理器::编译内存(HScript*脚本)
{
字符*字节码=0L;
大小字节码长度=0;
BS_descripp bd={&bytecode_len,&bytecode};
int buff_ret=luaL_loadbuffer(m_pLuaState,script->getData().c_str(),script->getBuffSize(),script->getName().c_str());
int comp_ret=lua_dump(m_pLuaState、scriptMemoryWriter和bd);
lua_pop(m_pLuaState,1);

std::cout第9行:
char*newData;=(char*)realloc(*(bd->data),(*(bd->len))+sz);

不要将
放在
char*newData
之后

这是正确的:

char* newData = (char*)realloc(*(bd->data), (*(bd->len)) + sz);

尽管如此,我仍然不确定它是否有效。

我将假设
char*newData;=(char
在您的问题中是一个输入错误,因为这样的代码无法编译

我认为问题在于您试图将字节码打印为字符串一个指向某个字符的指针,流将打印所有字符,从该内存位置开始,直到但不包括它在该内存地址后找到的第一个空字符。现在我从未看过Lua字节码,但我怀疑Lua字节码可能有空字节,这将导致打印输出看起来不完整。你只是在您的“完整”示例中,没有空字节


由于很多字节码都是不可打印的字符,您不妨打印它们的十进制值。替换
std::cout谢谢您的回答。但是字节码变量仍然不完整。我找不到解决这个问题的方法。这里是。谢谢。如果不是要求太多,请您知道如何传递直接内容对于std::string而不是BS_descripp?@WalbertiEvaristo抱歉不理解第二个问题。如果上述问题解决了,请接受/关闭并打开一个新问题,提供更多信息和您尝试实现的示例。谢谢。
std::cout << "bytecode: ";
for (int i=0; i<bytecode_len; i++)
    std::cout << int(bytecode[i]) << " ";
std::cout << std::endl;