2013-08-12 8 views
0

그래서 C#에서 스크립트 언어로 루아를 구현하려고합니다. 콘솔 응용 프로그램의 일부로 사용하면 간단합니다. 하지만 XNA 내에서 게임 콘솔을 만들 수 있기를 원합니다. 문제는 Lua.DoString()이 문자열이 아닌 콘솔 줄을 반환하는 것입니다. 콘솔 응용 프로그램에서는 괜찮 았지만 출력 버퍼에 문자열을 추가하여 표시 할 수 있습니다. 콘솔 윈도우가 아닌 게임 내에서. 이 코드가 혼란 스럽다면 사과드립니다.LuaInterface로 문자열 반환

using System; 
using System.Collections.Generic; 
using LuaInterface; 

namespace LuaConsoleLibrary 
{ 
    public class LuaConsole 
    { 
     private Lua lua; 

     private bool isRunning = true; 
     private string input; 
     private List<string> outputBuffer; 

     public bool IsRunning 
     { 
      get { return isRunning; } 
     } 

     public LuaConsole() 
     { 
      this.lua = lua; 
     } 

     public void Run() 
     { 
      int i = 0; 
      while(isRunning) 
      { 
       outputBuffer.Add("> "); 

       input = Console.ReadLine(); 
       outputBuffer.Add(""); 

       try 
       { 
        lua.DoString(input); 
       } 
       catch(Exception e) 
       { 
        outputBuffer.Add(e.Message); 
       } 
       finally 
       { 
        outputBuffer.Add(""); 
       } 
      } 
     } 
    } 
} 

는 기본적으로, Console.WriteLine(lua.DoString(input));를 사용하지 반대로 lua.DoString(input); 작동합니다 이유에 혼란 스러워요. 심지어는 outputBuffer.Add(lua.DoString(input).ToString());을 시도해 보았습니다. ToString이 유효하기 때문에 이론적으로 작동해야합니다. 대신 lua.DoString을 수행 한 다음 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."라는 예외를 throw합니다. 내가 실수하지 않는다면 문제의 객체는 Lua이며, 이는 lua을 유효한 객체 참조로 만듭니다. 어쨌든,이 두 가지 해결책이 작동하지 않는 것을 보면서, 누군가 LuaInterface에 대해 충분한 지식을 갖고 있으면 같은 결과를 얻는 다른 방법을 제안하게 될지 궁금합니다. 나는 기본적으로 outputBuffer.Add(lua.DoString(input));의 효과를 원한다. 그건 그렇고, 내가 사용하고있는 루아 명령어는 print("test")이다. 아마도 print은 어떻게 든 문자열 대신 콘솔 라인을 반환하지만, 루아로부터 문자열을 반환하는 다른 방법을 생각할 수 없다.

내 문제가 덜컹 거리거나 잘못 설명되는 경우 사과드립니다. 가능한 한 간결하게하려고했지만 틈새 문제 일 뿐이며 설명하는 방법을 모르겠습니다. 오, 나는 Google을 사용해 봤고 스택 오버플로에 대해 65 개 정도의 LuaInterface 질문을 탐색 했으므로이 질문을하기 전에 실사를 95 % 확신했습니다. LuaInterface는 도구로 잘 알려져 있지 않습니다.

+0

어떤 시점에서'새로운 루아()'가 필요하지 않습니까? 그렇지 않으면'lua'는 항상 null 참조입니다. 'this.lua = lua'는'lua' 필드를 할당하고 컴파일러 경고가 있어야합니다. –

+0

^나는 그가 이것에 맞다고 생각한다. 당신은 그 생성자에서 아무것도하지 않습니다. –

+0

잡기 좋은, mike z. 나는 그 자신을 알아 채지 못했다고는 믿을 수 없다 ... 그러나 실제 코드는 (단지 약간) 더 복잡하고 루아 인스턴스는 매개 변수로서 클래스에 전달된다 ... 그렇다, 거대한 문제이다. 내 예제 코드에서는,하지만 확실히 내 문제를 해결하지 않습니다. – bpunsky

답변

1

Object reference not set to instance of an object은 C#의 "무언가가 null이고 그것이 없어야합니다."라고 말하는 방식입니다.

이 경우 대부분의 DoString은 null을 반환하므로 null.ToString()이 예외를 발생시킵니다. null을 던지지 않고 문자열로 변환하려는 경우 outputBuffer.Add(Convert.ToString(lua.DoString(input)[0]))을 시도 할 수 있습니다.

나는 LuaInterface 나 NLua를 사용하지 않았지만 문자열을 반환하려면 실제로는 return "test"을 Lua 명령으로 실행해야한다고 생각합니다.

+0

그래, 나는 그 접근법을 포기했다. ToString()은 특정 객체의 기본 메소드입니다 (이 경우) 객체가 본질적으로 문자열로 변환 될 수없는 경우에도 마찬가지입니다. 예외는 나가 가지고있는 진짜 문제가 아니다. – bpunsky

+0

ToString은'object'의 가상 메소드이며 잘 작성된 모든 클래스는 비 던진 구현을 가져야합니다. 그러나 그것은 null을 dereferencing으로부터 보호하지 않을 것입니다. – Jimmy

+0

나는'return "test"'를 사용하는 것에 대해 당신의 생각을 시도했지만 정확히 _work_하지는 않지만 그 결과는 적어도 말하기에는 흥미 롭습니다. "System.Object []"를 콘솔에 인쇄합니다. 나는'Lua.DoString()'소스를 살펴 봤고 실제로'Object []'의 리턴 타입을 가지고있다. 나는 일반적인 객체의 배열이 어떻게 콘솔 라인으로 변환되는지 모르겠다. 어쨌든, 제안에 감사드립니다. – bpunsky