LZW-Encoder mit Array ohne Hashing
-
Hey Leutz,
wie der Titel schon sagt, geht es um den LZW-Algo. Mir sind Erklärungen gegeben zu den jeweiligen Funktionen, aber bei einer komme ich grad nicht weiter. Ich poste mal die Erklärung und schreibe dann was ich nicht verstehe.CLZWArray() Natürlich benötigen Sie einen Konstruktor. Im Konstruktor werden die ersten 256 Einträge des Dictionaries mit den Strings zu den Positionen 0-255 der ASCII- Tabelle belegt. Um einen int-Wert einem string zuzuweisen, können Sie in Klassen, die von CLZW abgeleitet sind, die Methode string intToString( int i) verwenden. Zum Beispiel wird der Wert 3 folgendermaßen der Position 3 des Dictionaries zugewiesen: m_symbolTable[3].setSymbol(intToString(3)); Das Gegenstück ist die Funktion unsigned int charToInt(char);, eben- falls eine statische Funktion der Klasse CLZW. Diese sollten Sie verwenden, damit auch Umlaute und andere Zeichen mit ASCII-Werten oberhalb 127 korrekt in den Zahlenbereich 128 bis 255 gewandelt werden.Der Abschnitt mit "Das Gegenstück ist die Fkt. ...", den verstehe ich nicht.
Also erstmal soll ich im Konstruktur die ASCII-Zeichen speichern, aber jetzt ist die Rede davon oberhalb von 127 korrekt umzuwandeln.
Vllcht kann mir das einer mal genauer erklären.MfG
AknayirpEDIT: Ich frage mal noch genauer: Reicht der erste Teil (vor "Der Gegenstück...") um im Konstruktur das Array mit den ASCII-Zeichen zu füllen oder brauche ich die Fkt. charToInt?
-
Aknayirp schrieb:
Der Abschnitt mit "Das Gegenstück ist die Fkt. ...", den verstehe ich nicht.
Das hat folgende Gewandnis:
Ein char speichert Werte von -128 bis 127 (ist nicht genau definiert, aber man muss darauf vorbereitet sein).
Im Dictionary stehen aber die Werte von 0-255. Deshalb muss der char fachgerecht in einen int umgewandelt werden. Das geht mitstatic_cast<unsigned char>(char).Aknayirp schrieb:
Also erstmal soll ich im Konstruktur die ASCII-Zeichen speichern, aber jetzt ist die Rede davon oberhalb von 127 korrekt umzuwandeln.
Der Aufgabensteller hat das mit Encodings offensichtlich nicht ganz verstanden. Er spricht auch von ASCII-Werten von 0-255 (lol). Ist wahrscheinlich ein Fehler von ihm, ignorier das einfach.
Aknayirp schrieb:
EDIT: Ich frage mal noch genauer: Reicht der erste Teil (vor "Der Gegenstück...") um im Konstruktur das Array mit den ASCII-Zeichen zu füllen oder brauche ich die Fkt. charToInt?
Wenn du die Tabelle mit ints füllst, nein. Die Funktion brauchst du nur, wenn du ein char vor dir hast.
-
Bewandnis!
-
Aber ich muss in mein Array (dictionary) doch am Anfang mit den Zeichen der ASCII-Tabelle füllen. So verstehe ich zumindest die Aufgabe des Konstrukturs in dieser Aufgab. Und ich habe das so realisiert.
CLZWArray::CLZWArray() { for(int i=0; i<256; i++) { m_symbolTable[i].setSymbol(intToString(i)); } }Durch die Fkt. intToString wandle ich ja die entsprechende Zahl zum Zeichen um und speichere das so ab.
Habe aber ehrlich gesagt durch deine Aussagen gerade nicht verstanden, ob ich das jetzt richtig mache oder nicht.
Ich frage auch deshalb, weil die ganzen Tests mich nicht zum entsprechenden Ergebnis führen. Und ich glaube es liegt daran.
Wäre toll, wenn man mir das nochmal näher bringen könnte.
Dannke
MfG
Aknayirp
-
Bewandtnis