我正在尝试创建一个目标c接口,它封装了存储和运行lua脚本(编译与否)的功能。我的脚本接口代码如下:
#import <Cocoa/Cocoa.h>
#import "Types.h"
#import "lua.h"
#include "lualib.h"
#include "lauxlib.h"
@interface Script : NSObject<NSCoding> {
@public
s32 size;
s8* data;
BOOL done;
}
@property s32 size;
@property s8* data;
@property BOOL done;
- (id) initWithScript: (u8*)data andSize:(s32)size;
- (id) initFromFile: (const char*)file;
- (void) runWithState: (lua_State*)state;
- (void) encodeWithCoder: (NSCoder*)coder;
- (id) initWithCoder: (NSCoder*)coder;
@end
#import "Script.h"
@implementation Script
@synthesize size;
@synthesize data;
@synthesize done;
- (id) initWithScript: (s8*)d andSize:(s32)s
{
self = [super init];
self->size = s;
self->data = d;
return self;
}
- (id) initFromFile:(const char *)file
{
FILE* p;
p = fopen(file, "rb");
if(p == NULL) return [super init];
fseek(p, 0, SEEK_END);
s32 fs = ftell(p);
rewind(p);
u8* buffer = (u8*)malloc(fs);
fread(buffer, 1, fs, p);
fclose(p);
return [self initWithScript:buffer andSize:size];
}
- (void) runWithState: (lua_State*)state
{
if(luaL_loadbuffer(state, [self data], [self size], "Script") != 0)
{
NSLog(@"Error loading lua chunk.");
return;
}
lua_pcall(state, 0, LUA_MULTRET, 0);
}
- (void) encodeWithCoder: (NSCoder*)coder
{
[coder encodeInt: size forKey: @"Script.size"];
[coder encodeBytes:data length:size forKey:@"Script.data"];
}
- (id) initWithCoder: (NSCoder*)coder
{
self = [super init];
NSUInteger actualSize;
size = [coder decodeIntForKey: @"Script.size"];
data = [[coder decodeBytesForKey:@"Script.data" returnedLength:&actualSize] retain];
return self;
}
@end
这是主要方法: #import“Script.h”
int main(int argc, char* argv[])
{
Script* script = [[Script alloc] initFromFile:"./test.lua"];
lua_State* state = luaL_newstate();
luaL_openlibs(state);
luaL_dostring(state, "print(_VERSION)");
[script runWithState:state];
luaL_dostring(state, "print(_VERSION)");
lua_close(state);
}
而lua脚本只是: 打印(“O Hai World!”)
加载文件是正确的,但我认为它在pcall上搞砸了。
非常感谢任何帮助。
标题
答案 0 :(得分:2)
您的代码非常复杂,没有明显的错误。但是,您的下一步应该是检查lua_pcall
的返回值。如果它非零,则堆栈顶部会出现一条错误消息,您可以通过
fprintf(stderr, "Pcall failed: %s\n", lua_tostring(state, -1));
如果没有收到有用的错误消息,我的下一步就是转储Lua堆栈。它上面有多少元素?每个元素的(Lua)类型是什么?什么是价值。函数lua_top
和luaL_typename
将非常有用。要打印该值,您必须打开lua_type
的结果。祝你好运。
答案 1 :(得分:0)
我没有运行你的代码。但乍看之下,我发现initWithScript的签名在头文件(使用u8 *)和源文件(使用s8 *)之间是不同的。