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:

Callocate und verkettete Liste- Problem

 
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
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 26.01.2008, 14:16    Titel: Callocate und verkettete Liste- Problem Antworten mit Zitat

Hallo, Forianer,
ich versuche, eine doppelt verkettete Liste zu erstellen. Die ersten drei Knoten (Kopf, Ende und erster Innenknoten) werden auch brav aufgebaut. Dabei gibt es aber das Problem, daß die Adressierungen nicht übereinstimmen. Mein Code sieht so aus:
Code:
Type ListEnd As EndNode

Type ListHead As HeadNode

Type ListItem
   Value As Integer
   ItemOrder As Integer
   pPrevItem As ListItem Ptr
   pNextItem As ListItem Ptr
   pListHead As ListHead Ptr
   pListEnd As ListEnd Ptr
   Declare Constructor(ByRef pHeadNode As ListHead Ptr, ByRef pEndNode As ListEnd Ptr,  ByRef pListItem As ListItem Ptr)
End Type

Dim pListItem As ListItem Ptr

Type EndNode
   pListHead As ListHead Ptr
   pLastItem As ListItem Ptr
   Declare Constructor (ByRef pHeadNode As ListHead Ptr,ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
End Type

Dim pEndNode As EndNode Ptr

Type HeadNode
   pFirstItem As ListItem Ptr
   pListEnd As ListEnd Ptr
   Declare Constructor (ByRef pHeadNode As HeadNode Ptr, ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
End Type
 
Dim pHeadNode As HeadNode Ptr  'Listenkopf einrichten

Constructor HeadNode (ByRef pHeadNode As HeadNode Ptr, ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
   Dim ListEnd As EndNode = EndNode (@this, pEndNode, pListItem)  'Listenende einrichten
   pEndNode = Callocate (Len(EndNode))
   pEndNode->pListHead = @this
   this.pFirstItem = pListItem
   'This.pListEnd = pEndNode
   this.pFirstItem = pListItem
   Print
   Print "Begin Constructor HeadNode"
   Print "Adresse = "; @this              '6618608
   Print "pEndNode = ";pEndNode           '7800112, stimmt nicht
   Print "pListItem = "; this.pFirstItem  '7800080- stimmt nicht
   Print "End Constructor HeadNode"
   Print
   sleep
End Constructor

Constructor EndNode (ByRef pListHead As ListHead Ptr, ByRef pEndNode As EndNode Ptr, ByRef pListItem As ListItem Ptr)
   pEndNode = @this
   Dim Item As ListItem = ListItem(pListHead, @this, pListItem)
   pListItem = Callocate(Len(Item)) 'Listenelement anlegen
   pListHead->pListEnd = @this
   'this.pLastItem = pListItem
   Print
   Print "Begin Constructor EndNode"
   Print "Adresse = "; @this       '6618568
   Print "pListHead = "; pListHead '6618608 stimmt
   Print "pListItem = ";pListItem  '7800080 stimmt nicht
   Print "End Constructor EndNode"
   Print
   sleep
End Constructor

Constructor ListItem(ByRef pHeadNode As ListHead Ptr, ByRef pEndNode As EndNode Ptr,  ByRef pListItem As ListItem Ptr)
   this.value = 6
   this.pListHead = pHeadNode
   this.pListEnd = pEndNode
   pListItem = @this
   Print
   Print "Begin Constructor ListItem"
   Print pHeadNode->pFirstItem = @this
   Print "Adresse = "; @this                '6618516
   Print "Value = "; this.value
   Print "this.pListHead = ";this.pListHead '6618608, stimmt
   Print "pListHead = "; pHeadNode          '6618608, stimmt
   Print "this.pListEnd =";this.pListEnd    '6618568, stimmt
   Print "End Constructor ListItem"
   Print
   sleep
End Constructor

Dim ListHead As HeadNode = HeadNode (pHeadNode, pEndNode, pListItem)


Die Adressen der jeweiligen Knoten und der zugehörigen Zeiger habe ich dahinter kommentiert. Wie man sieht, stimmen die Zeigerinhalte teilweise nicht mit den tatsächlichen Adressen überein. Dementsprechend kann ich nicht auf den Wert (Value) des Innenknotens zugreifen.
Ein Porblem scheint zu sein, daß ich nicht verstanden habe, in welcher Reihenfolge die Knoten erstellt werden, bzw. in welcher Reihenfolge die Adressen den Zeigern zugewiesen werden.
Was mache ich da falsch?
Danke für die Hilfe lächeln
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.01.2008, 20:42    Titel: Antworten mit Zitat

Ich glaube, ich habs selbst rausgefunden- trotz Eurer enthusiastischen Anteilnahme... zwinkern happy
Und zwar muß man die Speicher für die jeweiligen Knoten in den Knoten-Constuktoren calloziieren, und nicht schon vorher beim DIMmen im vorherigen Knoten.
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 27.01.2008, 22:25    Titel: Antworten mit Zitat

Hi Elektronix,
jaja, so hat alles sein Gutes, mein 'linked-list'-Projekt ist immer noch ohne Konzept auf der Platte und soweit wie du, bin ich schon gar nicht..
So wie es aussieht, hätte dir auch nicht das Tut auf FB-Portal helfen können..
So haben wir aber alle etwas davon, du am allermeisten xD
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 31.01.2008, 14:58    Titel: Antworten mit Zitat

So, habe ein bißchen weiter gefrickelt. Jetzt kam folgende Frage auf:

Ich habe den Head-, End-, und InternelNode per Callocate im Speicher abgelegt. Jetzt habe ich versucht, im InternalNode eine Funktion zu schreiben, die per this auf die Rekords des Knotens zugreift. Da sagt mir der Compiler "variable not declared".

Kann man auf alloziierte UDT-Records nicht per this zugreifen? Wie kann man das sonst machen?

[Edit] Man kann. Hab nur den Zeiger falsch deklariert Problem hat sich erledigt... happy
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 31.01.2008, 17:14    Titel: Antworten mit Zitat

Was ich nicht verstehe, warum du überhaupt zwischen Kopf-, mittleren und Fuß-Element unterscheidest. Bei deiner Variante kommt es nur zur unnötigen Code-Dopplung und vergrößerten Aufwand.

Hier ein Szenario, das zeigt wie kompliziert dein Weg doch ist:

Notation: LH = List head, LI = mittleres Element, LE = List end

Angenommen ich habe eine Liste L = LH - LI - LI - LE

Nun lösche ich, das letzte Element: Das heißt LE verschwindet und ich muss das davorstehende LI zu LE casten, was ziemlich aufwändig ist.
Weiterer Kritikpunkt deines Ansatzes ist, dass du nicht weißt, ob das nächste Element nun ein EndNode oder ListItem ist.

Also meine Empfehlung wäre, dass du alle von einem Typ hältst.
_________________
+++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 31.01.2008, 17:40    Titel: Antworten mit Zitat

@Stormy

Toll, daß Du Dich mit meinem Projekt auseinandersetzt. lächeln
Ich bin in Sachen Listen noch nicht so geübt, kann sein, daß ich da ein paar Redundanzen drin hab. Aber daran wird noch gebastelt.

Die Sache ist so gedacht: EndNode und HeadNode enthalten keine Werte und andere Records als IntNode. Jedes Listenelement hat zusätzlich zum Wert einen Pointer auf HeadNode und auf EndNode (wieweit das nötig ist, werde ich noch ausprobieren) sowie auf das vorhergehende und nächste Element. HeadNode verweist mit einem Pointer auf das erste Listenelement, EndNode auf das letzte.
Head- und EndNode werden somit nicht gelöscht, (darum wird auch nichts gecastet), sondern bilden nur den Rahmen der Liste. Sie werden erst beim endgültigen Beenden des ListProgramms dealloziiert.
Der HeadNode->FirstItem-Pointer auf das erste Element wird beim Eintrag eines neuen Elementes abgefragt und die Werte der beiden Elemente verglichen. Beim Eintragen oder Löschen eines Elementes müssen dann nur die Pointer neu gesetzt werden. Dadurch kann ich die Liste schon vorsortieren.
[Edit]
Möglich wäre natürlich auch, in die Elementknoten einen Namens-String einzusetzen, in dem einfach "Head", "Element "oder "End"steht und diesen dann zu kontrollieren. Dann bräuchte ich tatsächlich nur eine Art von Knoten, müßte aber z. B. beim Löschen des letzten Elementes die Pointer und den Namens-String neu setzen.
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.
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