Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

[ gelöst ] "Array" im Array -> Elemente abrufen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Make-Grafik



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 07.06.2013, 22:26    Titel: [ gelöst ] "Array" im Array -> Elemente abrufen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 08.06.2013, 14:11    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Make-Grafik



Anmeldungsdatum: 08.10.2012
Beiträge: 29

BeitragVerfasst am: 08.06.2013, 15:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz