2016-05-10 12 views
1

Ich schrieb einfache Klasse, um Daten zu komprimieren. Hier ist sie:Einfache LZW-Komprimierung funktioniert nicht

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 

Und ich laufe es durch:

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) 

Aber wenn ich es schließlich von lua ausführen, zeigt es, dass die Dolmetscher erwartete String nicht Tabelle. Das war komisch, weil ich ein Argument vom Typ string übergeben habe. Um zu testen, Lua Protokolle, schrieb ich an beggining der Funktion:

print(typeof(sInput)) 

Ich habe Ausgabe „Table“ und Lua Fehler. So, wie man es repariert? Warum zeigt Lua diese Zeichenfolge an (die ich übergeben habe) ist eine Tabelle? Ich benutze Lua 5.3.

+0

bitte zeigen Sie etwas mehr Mühe, um das Problem beim nächsten Mal selbst zu lösen. "Warum funktioniert dieser Code nicht?" Fragen werden auf SO heruntergeregelt oder gelöscht. Außerdem kann ich Ihren Code nicht einfach ausführen, um zu sehen, was passiert, da Sie kein korrektes [MCVE] bereitstellen. Bitte lesen Sie [ask] – Piglet

Antwort

1

Problem ist in der Definition der Methode Encode(), und höchstwahrscheinlich hat Decode() dasselbe Problem.
Sie erstellen Encode() -Methode mit Punktsyntax: self.Encode = function(sInput),
aber dann sind Sie es mit Doppelpunkt-Syntax aufrufen: compressor:Encode(data)
Wenn Sie Encode() mit Doppelpunkt-Syntax nennen, seine erste implizite Argument compressor sein wird, sich (Tabelle von Ihrem Fehler), nicht die Daten.
es zu beheben, erklären Encode() -Methode mit Doppelpunkt-Syntax: function self:Encode(sInput), oder fügen Sie ‚Selbst‘ als erstes Argument explizit self.Encode = function(self, sInput)

1

Der Code, den Sie nicht ausgeführt versehen sollte.

Sie function LZWCompressor.new() definieren, aber CLZWCompression.new()

Innen Encode Sie self:InitDictionary(true) rufen nennen, die nicht definiert ist.

Vielleicht haben Sie nicht alle relevanten Code hier eingefügt.

Der Grund für den Fehler, den Sie bekommen, ist, dass Sie compressor:Encode(sInput) anrufen, die compressor.Encode(self, sInput) entspricht. (syntaktischer Zucker) Als Funktionsparameter werden nicht namentlich, sondern durch ihre Position sInput innerhalb Encode ist jetzt compressor, nicht Ihre Zeichenfolge übergeben. Ihr erstes Argument (das zufällig self ist, eine Tabelle) wird dann an string.len übergeben, das eine Zeichenfolge erwartet. Sie rufen also string.len(compressor), was natürlich zu einem Fehler führt.

Bitte stellen Sie sicher, dass Sie wissen, wie Sie Funktionen aufrufen und definieren und wie Sie sich selbst richtig benutzen!

+0

Ich habe CLZWCompression im Aufruf von LZWCompression geändert. –