Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hawkeye78
Anmeldungsdatum: 04.05.2005 Beiträge: 6 Wohnort: Castrop-Rauxel
|
Verfasst am: 04.05.2005, 20:39 Titel: Realisierung einer verkettete Liste in QB |
|
|
Hallo,
es ist zwar schon ein bißchen her, das ich das letzte mal QBasic wirklich intensiv angefaßt habe. Aber nachdem ich mich neulich mit jemanden (Ray hier aus dem Forum) unterhalten habe bin ich wieder ein bißchen auf den Geschmack gekommen. Allerdings geht mir die Frage nun im Kopf herum ob sich ähnlich wie in Java oder C/C++ verkettete Liste realisieren lassen.
Meine letzten programmiererfahrungen in QBasic liegen nun auch schon gut 10 Jahre zurück und ich wäre daher über einen entsprechenden Tipp ob sich solche Strukturen realisieren lassen, sehr dankbar.
Gruß
Dan |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 04.05.2005, 20:52 Titel: |
|
|
also Basic-Datenfelder sind Standartmäßig statisch, können also nichtt verändert werden. Generiert man sie per REDIM kann man sie damit auch verändern in der Größe, dabei werden jedoch immer alle enthaltenen Daten gelöscht.
Für richtige Dynamik schau dir php an, damit kann man mit normalen Arrays alles machen, was man sich vorstellen kann.. das is einfach nur Wahnsinn. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
hawkeye78
Anmeldungsdatum: 04.05.2005 Beiträge: 6 Wohnort: Castrop-Rauxel
|
Verfasst am: 04.05.2005, 21:04 Titel: |
|
|
Hallo MisterD,
erst einmal vielen Dank für dein Posting, ja mit PHP und Java und wenn ich mir ganz viel Mühe gebe auch mit C kann ich umgehen. Aber da mir Ray so ein bißchen davon erzählt hat was er so alles in QBasic realisiert war ich nun mal neugierig was sich bezüglich Anwendungen (Listen, Bäume etc.) noch so alles realisieren läßt.
Ich danke dir noch einmal viel mals für dein Posting.
Gruß
Dan |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 04.05.2005, 22:30 Titel: |
|
|
na so lieb hat sich ja auch noch keiner bei mir für n Posting bedankt xD
Also php is relativ einfach zu lernen, dazu empfehle ich http://tut.php-q.net
Progman is irgendwie n komischer Typ, das is stellenweise auch etwas schwer zu lesen, aber man kann damit auskommen, was besseres wirst du ned finden. Brauchst halt nen Apache um das Zeugs auszuführen, dazu empfehle ich XAMPP von www.apachefriends.org -> alles drin was man braucht.
Das einzige Problem bei php ist, dass man nen saumäßigen Programmierstil bekommt.. dafür gewöhnt man sich GOTO nicht an, das gibts garnicht erst  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
hawkeye78
Anmeldungsdatum: 04.05.2005 Beiträge: 6 Wohnort: Castrop-Rauxel
|
Verfasst am: 05.05.2005, 09:31 Titel: |
|
|
Guten Morgen MisterD,
ja ich weiß ich habe mein Abschlußprojekt für meine Ausbildung in PHP in Kombination mit MySQL und HTML geschrieben. Daher habe ich ein paar Grundlegende Erfahrungen was diese Sprache betrifft .
Ich wünsche dir einen schönen Feiertag
Gruß
Dan |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 05.05.2005, 11:00 Titel: |
|
|
Verkettete Listen im Sinne von C/C++ sind bei QB nicht möglich, da QB keinen Heap verwaltet, bei dem man malloc() und free() bzw. ein "new"-Operator anwenden und so die Elemente mittels Pointer verknüpfen kann.
Damit aber dennoch die typischen Operationen wie etwas einfügen, herausnehmen usw. möglich sind, würde ich mich in diesem Fall einer Ersatzkostruktion mit Arrays bedienen
Code: | TYPE itemType
' nicht näher definiert (von der Anwendung abhängig)
END TYPE
DECLARE SUB TueEtwasMitItem(x AS itemType)
TYPE DListe
item AS itemType
naechst AS INTEGER
vorher AS INTEGER
END TYPE
' naechst und vorher wären in C/C++ Pointer, weil in QB Arrayindexe immer
' 16-Bit-Integer sind, nehmen wir sinnvollerweise diesen Datentyp dafür
DIM dl(0 TO 99) AS DListe, itm AS itemType
' Liste leeren/initialisieren
anker% = -1
naechstFrei% = 0
' Beispiele
' Liste durchgehen
a% = anker%
WHILE a%<>-1
TueEtwasMitItem dl(a%).item
a% = dl(a%).naechst
WEND
' Einfügen von itm _nach_ Element e%
IF naechstFrei% > UBOUND(dl) THEN
PRINT "Fehler: Kein Speicherplatz mehr"
ERROR 5
ELSE
' Einfügen
dl(naechstFrei%).item = itm
dl(naechstFrei%).naechst = dl(e%).naechst
dl(e%).naechst = naechstFrei%
dl(naechstFrei%).vorher = e%
dl(dl(naechstFrei%).naechst).vorher = naechstFrei%
naechstFrei% = naechstFrei% + 1
END IF |
Hinweis: Spezialfall Anfang und Ende ist nicht berücksichtigt. Jeder sollte sich gut vorstellen können, wie Operationen wie Eintrag entfernen usw. noch implementiert werden müssten, wobei man beim Löschen einfach das letzte Element in die freigewordene Lücke einbaut, so dass dass Array nie einen "DEFRAG.EXE" nötig hat. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
ChemicalWarfare

Anmeldungsdatum: 15.09.2004 Beiträge: 152
|
Verfasst am: 05.05.2005, 13:02 Titel: |
|
|
Nicht ganz, dreael, es ist möglich, aber da QB halt nicht mit Zeiger umgehen kann wie es C/C++ tuen, ist es sehr aufwändig (und langsam) und daher nicht zu empfehlen. Und eine alloc-Funktion kann sich ja wohl jeder schreiben, der ein bisschen asm kann. Aber die einfachste Möglichkeit ist die von Sebastian: DIM PRESERVE.
Zuletzt bearbeitet von ChemicalWarfare am 05.05.2005, 13:09, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 05.05.2005, 13:02 Titel: |
|
|
Zitat: | Verkettete Listen im Sinne von C/C++ sind bei QB nicht möglich. |
Ähm, wie bitte? Was sind denn verkettete Listen im Sinne von C/C++? Also verkettete Listen sind strukturen, die wie folgt definiert sind:
Eine Liste ist entweder eine leere Liste oder eine Liste bestehend aus einem Element (normaler Weise Head genannt) und einer weiteren Liste (Normalerweise Tail genannt). Das ist schon sei Lisp aus den frühen 60ern so und hat nix mit C oder gar C++ zu tun.
Dann gibt es auch noch doppelt verkettete Liste. Das sind Listen, die nicht nur ihren Nachfolger, sondern auch ihren vorgänger kennen.
Üblich sind Listen generell eher in funktionalen Sprachen. In imperativen verwendet man eher Arrays. Natürlich gibt es für beides Ausnahmen.
-------------------
Ein Array als Speicher zu ge/missbrauchen macht nur sehr selten Sinn, da die listentypischen Operationen nicht wirklich sinnvoll implementieren lassen, da normalerweise ständig neue Listen erstellt werden.
Um erfahrungen mit Listen zu sammeln würde ich empfehlen eine entsprechende Sprache (SML oder O'Caml würde ich hier empfehlen) anzusehen.
Natürlich sind Listen in vielen Sprachen möglich, allerdings ist der Umgang oft so kompliziert, das sich das Arbeiten nicht wirklich lohnt und das so viel anderes getan werden muss, das man den eigentlichen Algorithmus aus den Augen verliert. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 05.05.2005, 14:05 Titel: |
|
|
kann helium nur beipflichten, obwohl listen und deren abarten sehr wohl und häufig auch in imperativen/objektorientierten sprachen einsatz finden, siehe z.B. stl .
dreals ansatz is ein guter wenn man unbedingt dynamische listen in qbasic benötigt. blitz hat vor längerer zeit mal einen binär baum über diees methode implementiert ( für den quake level renderer ), außerdem hab ich glaub ich mal auf badlogic einen forum eintrag dazu auf english verfasst.
viel langsamer ist dieses dingens per array indizierung nicht. _________________ Yagl - yet another gameprogramming library |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 05.05.2005, 15:13 Titel: |
|
|
also bei Java gibts extra Listen, da kann man dann auch Iterator's draufsetzen um die, wenn sie nicht indiziert sind, zu durchlaufen.. Da gibts auch alle möglichen Methoden wie next, preview, add, delete etc.
bei php hat jedes Array standartmäßig einen internen Cursor, man kann also ein Array entweder mit
foreach($array as $var){
echo $var;
}
oder eben mit
reset($array);
while($var=next($array)){
echo $var;
}
durchlaufen, von daher kann man das einigermaßen als Liste benutzen, was halt nicht geht, ist, Einträge dazwischen einzufügen, das muss man manuell einfügen, sprich alle weiteren einträge verschieben. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
|