Lua и Objective C не работает скрипт - PullRequest
0 голосов
/ 25 мая 2010

Я пытаюсь создать целевой интерфейс 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 это просто: печать («О, мир Хай!»)

Загрузка файла правильная, но я думаю, что он портится на pcall.

Любая помощь с благодарностью.

Заголовок

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

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

fprintf(stderr, "Pcall failed: %s\n", lua_tostring(state, -1));

Если вы не получите полезного сообщения об ошибке, моим следующим шагом будет сброс дампа стека Lua. Сколько элементов на нем? Каков тип (Lua) каждого элемента? Какова стоимость. Функции lua_top и luaL_typename будут полезны. Чтобы напечатать значение, вам нужно будет включить результаты lua_type. Удачи.

0 голосов
/ 26 мая 2010

Я не запускал твой код. Но на первый взгляд я обнаружил, что сигнатура initWithScript: различна для файла заголовка (используя u8 *) и исходного файла (используя s8 *).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...