2016-05-10 13 views
1

データを圧縮するための簡単なクラスを作成しました。ここでは、次のとおりです。単純なLZW圧縮は動作しません

LZWCompressor = {} 
function LZWCompressor.new() 
    local self = {} 
    self.mDictionary = {} 
    self.mDictionaryLen = 0 
    -- ... 
    self.Encode = function(sInput) 
    self:InitDictionary(true) 
    local s = "" 
    local ch = "" 
    local len = string.len(sInput) 
    local result = {} 
    local dic = self.mDictionary 
    local temp = 0 
    for i = 1, len do 
     ch = string.sub(sInput, i, i) 
     temp = s..ch 
     if dic[temp] then 
      s = temp 
     else 
      result[#result + 1] = dic[s] 
      self.mDictionaryLen = self.mDictionaryLen + 1 
      dic[temp] = self.mDictionaryLen   
      s = ch 
     end 
    end 
    result[#result + 1] = dic[s] 
    return result 
    end 
    -- ... 
    return self 
end 

と私はでそれを実行します。

local compressor = LZWCompression.new() 
local encodedData = compressor:Encode("I like LZW, but it doesnt want to compress this text.") 


print("Input length:",string.len(originalString)) 
print("Output length:",#encodedData) 


local decodedString = compressor:Decode(encodedData) 
print(decodedString) 
print(originalString == decodedString) 

しかし、私は最終的にLUAで、それを実行すると、それはその通訳期待文字列ではなく、を示しています。私はstring型の引数を渡すので、それは奇妙なことでした。ルアのログをテストするために、私は関数の先頭に書いた:

print(typeof(sInput)) 

"テーブル"とluaのエラーが出ました。どのようにそれを修正するには?なぜluaがその文字列(私が渡した)が表であることを表示するのですか?私はLua 5.3を使用しています。

+0

次回は、問題を解決するためにさらに努力してください。 「なぜこのコードは機能しないのですか」という質問は、SOで下降または削除される傾向があります。また、コードを実行して、適切な[MCVE]を提供していないときに何が起こっているのかを確認することはできません。 [ask]をお読みください – Piglet

答えて

1

問題はEncode()メソッドの定義にあり、おそらくDecode()は同じ問題を抱えています。
あなたは、ドットシンタックスを使用してエンコード()メソッドを作成します:
self.Encode = function(sInput)が、その後、あなたがコロン構文でそれを呼んでいる:compressor:Encode(data)
あなたはコロン構文でエンコード()を呼び出すと、その最初の暗黙の引数がcompressor自体(表になりますエラーではなく)、データではありません。 function self:Encode(sInput)、または最初の引数として、あなたがすべてで実行すべきではありません提供明示的self.Encode = function(self, sInput)

1

コードを「自己」を追加します。それを修正する
、コロン構文でエンコード()メソッドを宣言します。

あなたはfunction LZWCompressor.new()を定義していますが定義されていないself:InitDictionary(true)を呼び出すCLZWCompression.new()

内部エンコードを呼び出します。

ここにすべての関連コードを貼り付けていないことがあります。

エラーの原因はcompressor:Encode(sInput)で、これはcompressor.Encode(self, sInput)と同じです。 (構文砂糖)関数のパラメータは名前ではなく、その位置によって渡されます。エンコード内のsInputは現在文字列ではなくcompressorです。 最初の引数(self、表)は、string.lenに渡され、文字列が必要です。 string.len(compressor)は間違いなくエラーになります。

関数を呼び出す方法と定義する方法と、自己を正しく使う方法を知っていることを確認してください。

+0

LZWCompressionの呼び出しでCLZWCompressionを変更しました。 –

関連する問題