 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 07.06.2013, 22:26 Titel: [ gelöst ] "Array" im Array -> Elemente abrufen |
|
|
Hallo Community!
In letzter Zeit habe ich mich viel mit Datenkompressions Algorithmen beschäftigt. Nun wollte ich einmal selber so einen Algorithmus umsetzen. Der erste den ich ins Visier genommen habe ist die Shannon-Fano-Kodierung. Hier der entsprechende Wikipedia Artikel dazu: Wikipedia - Shannon-Fano-Kodierung
Derzeitig kann ich jede Bytefolge kodieren, aber nicht dekodieren. Für die Dekodierung muss der Baum ja mitgegeben werden. Aber bei der zurück Verwandlung (Bitweise den Baum entlang gehen) hängt es. Meine Idee war es, Arrays für jede Abzweigung anzulegen und für jeden Zweig den Array Pointer in das vorherige Array zu legen. So verzweigen sich die Array's ineinander und man kann von der Wurzel aus ausgehen. Hier ein Codestück um meine Idee zu erläutern:
Code: | Dim As Integer Ptr arrOne(2) ' Dies ist die Baumwurzel
Dim As Integer arrTwo(2) ' Eine Abzweigung des Baumes
Dim As Integer arrThree(2)
arrTwo(0) = 1
arrTwo(1) = 2
arrThree(0) = 3
arrThree(1) = 4
arrOne(0) = @arrTwo(0) ' Den Baum inneinander verstricken
arrOne(1) = @arrThree(0)
Dim As Integer arrFour(2) ' Arrays für das Auslesen der Elemente reservieren
Dim As Integer arrFive(2)
arrFour(0) = *arrOne(0)
arrFour(1) = *arrOne(0) ' brauche Element in Index (1) von arrTwo
arrFive(0) = *arrOne(1)
arrFive(1) = *arrOne(1) ' brauche Element in Index (1) von arrThree
Print arrFour(0)
Print arrFour(1)
Print arrFive(0)
Print arrFive(1)
Sleep |
Allerdings habe ich das Problem, dass ich keine Elemente abrufen kann, welche einen anderen Index besitzen als 0. Ich hoffe mir kann jemand bei dieser Idee weiterhelfen oder sogar einen besseren Lösungsvorschlag geben. Es geht nur um die Dekodierung. Zum kodieren ist so ein Baum gar nicht nötig. Dieser wird ja anhand der zu kodierenden Zeichenkette erstellt. _________________ Hmn :/ Mal schaun was es bringt...
Zuletzt bearbeitet von Make-Grafik am 08.06.2013, 15:44, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 08.06.2013, 14:11 Titel: |
|
|
Deine Implementierung eines Baums kommt mir etwas seltsam vor. Ich würde das in etwa so machen:
Code: | type tree
value as String*1
left as tree ptr
right as tree ptr
end type | bzw. wenn du unbedingt ein Array brauchst:
Code: | type tree
value as String*1
children (0 to 1) as tree ptr
end type |
_________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
Make-Grafik
Anmeldungsdatum: 08.10.2012 Beiträge: 29
|
Verfasst am: 08.06.2013, 15:43 Titel: |
|
|
Danke für den Tipp / Hinweis / Lösung mit dem Type!
Wäre ich so nicht drauf gekommen...
Funktioniert einwandfrei:
Code: | Type Tree
sV As String * 1
Dim As Tree Ptr pL, pR
End Type
Randomize
Dim As Tree tRoot, tBranchA, tBranchB, tLeafA, tLeafB, tLeafC, tLeafD, tTemp
Dim iRnd As Integer
Dim sString As String
' Wurzel
tRoot.pL = @tBranchA
tRoot.pR = @tBranchB
' Zweig 1
tBranchA.pL = @tLeafA
tBranchA.pR = @tLeafB
' Zweig 2
tBranchB.pL = @tLeafC
tBranchB.pR = @tLeafD
' Blätter
tLeafA.sV = "A"
tLeafB.sV = "B"
tLeafC.sV = "C"
tLeafD.sV = "D"
' Rekursiver Aufruf des Baumes
tTemp = tRoot ' An der Wurzel beginnen
While tTemp.sV = "" ' Solange durchgehen bis ein Blatt erreicht wird
iRnd = CInt(Rnd)
sString &= Str(iRnd)
If iRnd Then
tTemp = *tTemp.pR ' Gehe den Zweig nach Rechts | sString &= 1
Else
tTemp = *tTemp.pL ' Gehe den Zweig nach Links | sSring &= 0
End If
Wend
Print tTemp.sV
Print sString
Sleep |
_________________ Hmn :/ Mal schaun was es bringt... |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|