Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 24.04.2011, 20:28 Titel: Verkettete Liste (auch für Strings) |
|
|
Ich habe Heute eine Doppelt Verkettete Liste geschrieben. Viele Funktionen hat die Liste bisher nicht, aber sie kann für verschiedene Datentypen benutzt werden und auch mit Strings umgehen (im gegensatz zu den Listen die ich hier im Forum gefunden habe).
Ich weiß nicht ob wirklich bedarf besteht, aber ich hab hier keine Schlanke Liste gefunden, die mit mehreren Datentypen kompfortabel umgehen kann und Strings händelt.
Benutzung ist recht einfach über Code: | make_list(<datentyp>, <name>) |
Zu bedenken ist, das der Name des Listen-UDTs automatisch um "_list" ergänzt wird.
Member-Funktionen der Liste sind:
Apppend(element) - Anhängen von Elementen an das Ende der Liste
Insert(x, element) - Einfügen von Elementen mitten in die Liste
item(x) - Zugriff auf ein Element der Liste (Schreiben und Lesen der Werte)
getptr(x) - Wie item(), arbeitet aber mit den Pointern auf die Elemente
remove(x) - Löschen eines Elementes aus der Liste
Der Code (inklusive eines kleinen Beispiels am Ende) findet ihr hier:
fb:porticula NoPaste #1256
Ich freue mich über jede Form von Rückmeldung  _________________ Milch ftw 
Zuletzt bearbeitet von MilkFreeze am 27.04.2011, 16:16, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 24.04.2011, 21:02 Titel: |
|
|
Mir ist folgendes aufgefallen:
koenntest du
Code: | property ##list_name##_list.item(index as integer) as datatype ptr
'Wir benutzen get_element() und geben gleich p_element aus:
return (this.get_element(index)->p_element)
end property |
zu
Code: | property ##list_name##_list.item(index as integer) as datatype
'Wir benutzen get_element() und geben gleich p_element aus:
return *(this.get_element(index)->p_element)
end property |
mchen, da wenn ich einen datatype reingebe diesen auch raushaben will und keinen zeiger.
Zu
Code: | delete this.p_element |
ich dachte nicht mit Allocate / Callocate erzeugter speicher soll mit Deallocate freigegeben werden.
Noch was anderes.
Die Liste wird nicht zerstoert, wenn man nicht alles selbst mit remove entfernt. |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 24.04.2011, 22:02 Titel: |
|
|
XOR hat Folgendes geschrieben: | Mir ist folgendes aufgefallen:
koenntest du
Code: | property ##list_name##_list.item(index as integer) as datatype ptr
'Wir benutzen get_element() und geben gleich p_element aus:
return (this.get_element(index)->p_element)
end property |
zu
Code: | property ##list_name##_list.item(index as integer) as datatype
'Wir benutzen get_element() und geben gleich p_element aus:
return *(this.get_element(index)->p_element)
end property |
mchen, da wenn ich einen datatype reingebe diesen auch raushaben will und keinen zeiger. |
An sich keine schlechte Idee, aber wenn man einen UDT hat und davon eine Liste erzeugt kann mit .item(x)->element auf das Element zugegriffen werden, und eventuelle Änderungen werden innerhalb der Liste gemacht, müssen also nicht Nachträglich in die Liste geschoben werden. Wenn unbedingt benötigt kann ich noch ein item_value() oder so etwas in der Art einfügen, wenn nur der Wert, aber nicht der Pointer benötigt wird.
XOR hat Folgendes geschrieben: | Zu
Code: | delete this.p_element |
ich dachte nicht mit Allocate / Callocate erzeugter speicher soll mit Deallocate freigegeben werden.
Noch was anderes.
Die Liste wird nicht zerstoert, wenn man nicht alles selbst mit remove entfernt. |
Kann ich beides Fixen. Danke für den Hinweis. _________________ Milch ftw  |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 25.04.2011, 11:54 Titel: |
|
|
Hab gerade die Subroutine "destroy()" sowie einen Destructor dazugeschrieben. Der Desctructor von ##list_name##_list_el wurde auch erweitert und zerstört alle nachfolgenden Teile der Liste mit. Remove() habe ich entsprechend angepasst.
Oh, und ich hab die Operatoren "LET" und "+=" für die Liste überladen. LET könnte bei großen Listen sehr langsam werden, da die Elemente aus der zweiten Liste kopiert werden, damit die Speicheraddressen nicht identisch bleiben (Könnte sonst probleme geben wenn man die Kopie zerstört und mit dem Original weiter arbeitet).
Link: fb:porticula NoPaste #1254
P.S.: Elemente die String beinhalten werden nun mit Deallocate vernichtet  _________________ Milch ftw  |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 25.04.2011, 18:47 Titel: |
|
|
Zitat: | An sich keine schlechte Idee, aber wenn man einen UDT hat und davon eine Liste erzeugt kann mit .item(x)->element auf das Element zugegriffen werden, und eventuelle Änderungen werden innerhalb der Liste gemacht, müssen also nicht Nachträglich in die Liste geschoben werden. Wenn unbedingt benötigt kann ich noch ein item_value() oder so etwas in der Art einfügen, wenn nur der Wert, aber nicht der Pointer benötigt wird. |
du kannst es ja so machen das "item" die variable zuruckgibt und "getPointer" oder so aenlich den zeiger.
Edit:
mit insert(1,X) kann ich ein element an aller erster stelle erstellen. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 25.04.2011, 19:26 Titel: |
|
|
deine Remove-Prozedur solltest du aber nochmal überarbeiten. (Erstes / mittleres / letztes element)
MfG
TPM
PS: gibt schon n paar LL's die auch Strings unterstützt. _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 25.04.2011, 22:38 Titel: |
|
|
XOR hat Folgendes geschrieben: |
du kannst es ja so machen das "item" die variable zuruckgibt und "getPointer" oder so aenlich den zeiger. |
Gute Idee, mach ich Morgen.
XOR hat Folgendes geschrieben: | Edit:
mit insert(1,X) kann ich ein element an aller erster stelle erstellen. |
Wenn die Liste leer ist oder wenn schon Elemente in der Liste vorhanden sind? Wenn schon ein oder mehr Elemente vorhanden sind ist das tatsächlich ein Fehler.
Die Liste soll möglichst Fehlertolerant sein. Wenn eine Operation nicht möglich ist, wird entweder schweigend abgebrochen (exit sub) oder eine naheliegende Aktion durchgeführt. Deswegen Funktioniert Insert() auch bei einer leeren Liste.
@ThePuppetMaster:
Ich weiß. Deine Liste kann ja auch Strings, ist in meinen Augen aber mehr Baum als Liste und damit User Defined Types händeln ist sehr umständlich. Die anderen Listen konnten entweder keine Strings, hatten zu viele Funktionen die ich selbst nicht brauche, waren nicht doppelt verkettet oder gar keine richtigen Listen sondern Arrays.
Hast du zu der Fehlerhaften remove()-Funktion einen Beispielcode? _________________ Milch ftw  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 25.04.2011, 22:49 Titel: |
|
|
MilkFreeze hat Folgendes geschrieben: | Hast du zu der Fehlerhaften remove()-Funktion einen Beispielcode? |
Erzeuge element, entferne das erste und greife auf die liste zu. sie wird korrupt sein.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 26.04.2011, 02:12 Titel: |
|
|
Zitat: | XOR hat Folgendes geschrieben:
Edit:
mit insert(1,X) kann ich ein element an aller erster stelle erstellen.
Wenn die Liste leer ist oder wenn schon Elemente in der Liste vorhanden sind? Wenn schon ein oder mehr Elemente vorhanden sind ist das tatsächlich ein Fehler. |
sorry ich meinte mit insert(1,X) kann ich ->kein<- element an aller erster stelle erstellen.
normalerwiese wenn man insert(Posi,X) nimmt sollte das itme an der position Posi nach Posi+1 verschoben werden und das neue item an die position Posi kommen so das insert(getCount(),X) kein element an letzter, sondern an vorletzter stelle erstellt. |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 26.04.2011, 11:49 Titel: |
|
|
Die Remove-Funktion habe ich schon korrigiert.
Item() gibt jetzt die Werte zurück,
getptr() gibt die Pointer.
Insert() korrigiere ich nachher und lade die neue Version auf das Portal hoch. _________________ Milch ftw  |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 26.04.2011, 16:01 Titel: |
|
|
hab gerade Insert() umgeschrieben. Hier das Ergebnis:
fb:porticula NoPaste #1255
Ich habe den Link im Eingangspost auch mal geändert. _________________ Milch ftw  |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 26.04.2011, 17:43 Titel: |
|
|
St_W hat Folgendes geschrieben: | Noch kein FBedit oder Windows Nutzer?
Dann wirds Zeit für den Umstieg auf FBedit und Windows  | L ooo L !!!
das is keine Eigenwerbugn das is "Religions-Zwang"
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 26.04.2011, 21:19 Titel: |
|
|
St_W hat Folgendes geschrieben: | Warum bei jeder Änderung eines Quelltextes in fb:porticula einen neuen Eintrag erstellen, wenn dieser auch geändert werden könnte? |
Das Klingt erstmal nicht schlecht... aber:
Du verlangst viel von mir. Ich benutze zwar manchmal Windows - und bin durchaus positiv überrascht von Windows 7. Aber nur um einen Porticula-Eintrag zu editieren werde ich nicht in den Laden gehen und mir eine Windows-Lizenz kaufen. Und bisher bin ich mit Geany sehr zufrieden. Immerhin kann ich damit auch den Sourcecode anderer Sprachen mit Syntaxhighlight begutachten und brauch so nur eine IDE.
Entschuldigung, aber den gefallen auf FBedit (und Windows) umzusteigen kann ich dir beim besten willen nicht erfüllen. Trotzdem danke für den Tipp. _________________ Milch ftw  |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 26.04.2011, 22:27 Titel: |
|
|
Fehler:
->bei:
Code: | property ##list_name##_list.getptr(index as integer, value as datatype ptr)
'Wir benutzen get_element() und schieben den Wert gleich in p_element:
this.get_element(index)->p_element = value
end property |
wird p_element zu value, das alte p_element wird nicht dealloziert aber das von dir geschriebene.
->bei:
remove(1) und remove(0) fueren zum absturz.
bei remove(0) weil
Code: | if (index < 0 or index > this.i_count) then exit sub |
nur abgebrochen wird, wenn index kleiner als 0 ist und nicht gleich.
bei remove(1) weil
Code: | if (index = this.i_count) then
? "muh"
'p_last korrigieren:
this.p_last = p_tmp_item->p_prev
'p_last->p_next leeren:
this.p_last->p_next = 0
else
p_tmp_item->p_next->p_prev = p_tmp_item->p_prev
p_tmp_item->p_prev->p_next = p_tmp_item->p_next
end if |
du bei einem nullptr "p_tmp_item->p_prev" p_next schreiben willst.
zu getptr:
ich wuerde ihn nur ausgeben, nicht aber setzen lassen. |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 27.04.2011, 16:14 Titel: |
|
|
Behoben. Lade gleich den Code hoch und aktualisiere den ersten Post. _________________ Milch ftw  |
|
Nach oben |
|
 |
Luke

Anmeldungsdatum: 14.01.2009 Beiträge: 92 Wohnort: Ostfriesland !
|
Verfasst am: 02.05.2011, 18:26 Titel: |
|
|
Hey, das ist auch mal ein schönes Projekt. Ich brauche für viele meiner Programme Listen, und schreibe mir dann immer behelfsmäßig ein paar funktiönchen zusammen, und halte mich daran immer auf......Ich bin auch noch nie zu einer Zusammenfassung gekommen. Dann kann ich ja deine zukünftig nutzen, wenn du nichts dagegen hast
ist wenigstens gleich alles beisammen und funktioniert  _________________ ICH war mal schizophren, aber jetzt sind WIR okay. |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 04.05.2011, 23:40 Titel: |
|
|
Wenn du meinen Namen noch irgendwo erwähnst wär das nett, ist aber nicht unbedingt nötig. Wenn ich gewollt hätte das die Liste niemand benutzt, dann hätte ich sie nicht veröffentlicht  _________________ Milch ftw  |
|
Nach oben |
|
 |
|