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:

Dynamisches Array innerhalb einer UDT?
Gehe zu Seite 1, 2  Weiter
 
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
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 30.05.2008, 13:26    Titel: Dynamisches Array innerhalb einer UDT? Antworten mit Zitat

Kann man ein dynamisches Array innerhalb eines UDTs erstellen?

Mit REDIM funktioniert es ja schon mal nicht... sagt ja auch schon die Referenz.

Aber vielleicht weiss einer nen kniff wie man es doch hinbekommen kann...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 30.05.2008, 14:52    Titel: Antworten mit Zitat

Mit nem any ptr und dann rumcasten? durchgeknallt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 30.05.2008, 15:53    Titel: Antworten mit Zitat

Hallo,

ich würde statt eines Arrays in diesem Fall eine einfach verkettete Liste benutzen und deren Startzeiger in den UDT aufnehmen. Das ist vermutlich die einfachste Variante, wenn nicht unbedingt die Datenstruktur Array gebraucht wird.

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 02.06.2008, 14:50    Titel: Antworten mit Zitat

@ Sebastian: Was meinst du mit verkettete liste?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

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

Hallo,

auf FreeBASIC-Portal.de gibt's ein Tutorial zum Thema: http://www.freebasic-portal.de/index.php?s=tutorials&id=37&seite=1 lächeln

Ansonsten: http://www.google.de/search?hl=de&q=verkettete+liste&btnG=Google-Suche&meta= zwinkern

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
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: 02.06.2008, 15:06    Titel: Antworten mit Zitat

Verkettete Listen sind dynamische Datenstrukturen, die zur Laufzeit im Speicher erstellt werden. Jedes Element enthält einen Zeiger auf eine nachfolgendes Element, über spezielle Zugriffsfunktionen kann man Werte anfügen und abfragen oder löschen.

Hat den Vorteil, daß man den Listenkopf in anderen Datenstrukturen unterbringen kann und dann darüber auf alle Daten der Liste zugreifen kann, unabhängig von der Länge der Liste.
Zu beachten ist, daß die Speicherstellen für die Liste zur Laufzeig per allocate angefordert werden. Die müssen also am Ende mit Deallocate wieder freigegeben werden, sonst gibt es Speicherleaks. In dem Beispiel gibt es dafür extra Funktionen.

http://www.freebasic-portal.de/index.php?s=tutorials&id=37&seite=1
als Beispiel hier:
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=482
_________________
Und die Grundgebihr is aa scho drin- DOS is jo nett.


Zuletzt bearbeitet von Elektronix am 02.06.2008, 15:10, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 02.06.2008, 15:09    Titel: Antworten mit Zitat

Sehr geil! .. danke, da hab ich in dem zusammenhang noch gar nicht gedachtt!!!

*verneig*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 02.06.2008, 15:36    Titel: Antworten mit Zitat

Ok, ich weiss ich nerve.. aber in dem beispiel aus dem freebasic-portal kann ich nicht nachvollziehen wie man das ende der kette ermittelt..

Sie schreiben in etwa:

Code:

do
 .
 .
 .
 If Element->Naechstes  0 Then
  'Listenende noch
  'nicht erreicht?
  Element = Element->Naechstes
   'Dann ein Element
   'weitergehen!
 Else
  Exit Do
  'Ansonsten Schleife
  'verlassen.
 End If
 .
 .
loop


In der Zeile der IF-Klausel gibt mir fbc folgende meldung:
Code:

C:/Programme/FreeBASIC/FreeBasic/FBIDETEMP.bas(18) error 32: Expected 'THEN' in 'If Element->Naechstes  0 Then'


Die Form der IF-Anweisung kommt mir sowieso ziemlich Spanisch vor.. und ich kann gar kein Spanisch...

was soll "Element->Naechstes 0" für eine Wahrheitsaussage haben? In meinen Augen fehlt da mindestens ein (logischer) operand ....
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 02.06.2008, 15:47    Titel: Antworten mit Zitat

Code:
 IF Element->Naechstes <> 0 THEN

Die < > Zeichen verschwinden schon mal gerne bei php geschockt
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 02.06.2008, 15:53    Titel: Antworten mit Zitat

Ah ok, das ergibt sinn lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 02.06.2008, 16:05    Titel: Antworten mit Zitat

Hallo,

ich hab den Fehler korrigiert. Das php-Script muss die Ungleich-Vergleichsoperatoren verschluckt haben. Seltsam ist dabei nur, dass die übrigen spitzen Klammern <, > einzeln vorhanden waren und nur die <> gefehlt haben... verwundert

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 02.06.2008, 17:03    Titel: Antworten mit Zitat

Es gibt noch einen kleinen Trick, um die zugriffszeiten auf eine verkettete Liste zu erhöhen. Auserdem kann man dadurch eine Indizierung erreichen.

Man erstellt zusätzlich zu der LinkedList einen Speicher, der ausschliesslich Integer PTRs speichert. Hat man 10 Einträge erstellt, stehen die Startadressen zu den jeweiligen Elementen nicht nur am ende eines jeden Elementes, sondern auch in der Zusätzlichen Tabelle.

Möchte man jetzt auf element 5 von 10 zugreifen, rechnet man einfach SizeOf(Integer Ptr) * 5 und erhält dadurch die Startadresse zu dem jeweiligen Element.

Zwar wird dadurch die Liste etwas aufwendiger, jedoch beschleunigt und vereinfacht sich der zugriff auf Listeneinträge durch vortlaufende Indexnummern enorm. Beim Löschen wirds dann etwas Langsamer, was man allerdigns mit MoveMem geschickt beschleunigen kann.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 02.06.2008, 19:03    Titel: Antworten mit Zitat

ThePuppetMaster hat Folgendes geschrieben:

Es gibt noch einen kleinen Trick, um die zugriffszeiten auf eine verkettete Liste zu erhöhen.

Nur will man meist genau das nicht. grinsen
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 02.06.2008, 21:40    Titel: Antworten mit Zitat

Hä? was meinst du? Verstehe deine Aussage nicht.


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

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

Also.... ich weiß ja nicht wie's dir geht, aber ich mag meine Zugriffszeiten eher klein und möchte es vermeiden,
ThePuppetMaster hat Folgendes geschrieben:
die zugriffszeiten auf eine verkette Liste zu erhöhen.


Aber Jeder wie er mag, ne?

Und nebenbei: In der Tat - alles an einer Verkettete Liste zusätzlich erhöht die Zugriffszeit. Dein "zusätzliches Array" ist eine Verschwendung von Speicherplatz, muss bei jedem zusätzlichen oder entfernten Glied der Liste neu erstellt werden ('da full monkey' mit realloc preserve, erhöht die Zugriffszeit übrigens nochweiter), weil ja nicht bekannt ist, wie viele Elemente mal so gesamt in der Liste sein sollen.

Wenn Du Geschwindigkeit haben willst, bist bei ner Linked List an der falschen Adresse. Lutz Ifer empfiehlt ne Hash-Map.

Hugh, ich habe gesprochen.
_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 02.06.2008, 22:27    Titel: Antworten mit Zitat

hugh! oder du pflanzen baum! hugh!
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 02.06.2008, 22:33    Titel: Antworten mit Zitat

Neu erstellt werden?!? .. Was muss da grossartig neu erstellt werden?! .. das is n MoveMem und damit hat sich die "neuerstellung" schon. und die paar µs die das braucht, wirken sich negativ auf erstellen oder lsöchen von einträge aus. der zugriff auf element ebeschleunigt sich durch indexnummern gewaltig, im vergleich zu einer verketteten liste, da die Speicheradressen jedes elements im vorherigen steht .. sprich .. man muss alle elemente durchlaufen, um das zu finden,w as man sucht! ...

Mit einem 2ten array (im speicher) kann man das auffinden eines Pointers zum jeweiligen Element durch eine mathematische rechnung drastisch verkürzen. WO zum geier soll da was langsam sein?!?


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 02.06.2008, 22:40    Titel: Antworten mit Zitat

es ist egal wie viele optimierungen oder pseudooptimierungen du an deiner liste machst, es bleibt ne liste, die kriegst du nich aus O(n) für wahlfreien zugriff raus, das geht nur mit hashtables oder bäumen..
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
Lutz Ifer
Grillmeister


Anmeldungsdatum: 23.09.2005
Beiträge: 555

BeitragVerfasst am: 02.06.2008, 22:52    Titel: Antworten mit Zitat

Lieber Puppetmaster.

Stelle dir eine Verkette Liste mit sagen wir 1.000.000 Einträgen vor. Soweit so gut, so scheusslich groß.

Lösche bitte Eintrag Nummer 42, und füge einen Eintrag zwischen Nummer 5 und 6 ein.

42 löschen:
Folgepointer von 41 auf Position von 43 setzen, Element 42 löschen. Jetzt geht der Spaß mit deinem Index-Array los: von 42 bis 1.000.000 muss jeder Wert durch seinen Folgewert ersetzt werden. Meinetwegen, geht noch "relativ" schnell, mit Deinem MemMove lösbar. Wenn Du das aber sauber lösen willst, musst Du auch noch das Array verkleinern. Reallocate Preserve? Macht auch nichts anderes, als ein neues Array erstellen, dass die gewünschte Größe hat, und alle Werte kopiert, dann das alte löscht. Da wirds haarig. Meinetwegen, auch hier wieder "MemMove", geht "relativ" schnell - wir haben insgesamt knapp 2 MB im Speicher verschoben, und zwischenzeitlich (in der Übergangsphase) fast den doppelten Speicher deines Indexarrays belegt.

Nach 5 einfügen:
Neues Element erzeugen, Folgepointer auf Nummer 6 setzen, Folgepointer von Nummer 5 auf neues Element. Jetzt geht erneut der Spaß mit Deinem Index-Array los - ich spar's mir, es nochmal zu schreiben. Wieder 2 MB durch den Ram schieben, und neue Array erzeugen.

Wenn du Spaß dran hast, vergleiche mal dein mem-ge-movte array-indizierte Version mit der Normalen. Sicher mag der lesende Zugriff auf dein Konstrukt schneller sein - aber ne Linked List wird nicht nur gelesen, sonst könnte ich gleich nen Array nehmen, und eben keine LL. Also, fülle mal bitte eine "normale" LL und "deine" LL mit 1.000.000 Einträgen, und sag' mir, was dabei rauskommt.

Gruß
Lutz Ifer

ps: ich bin der Teufel, ich pflanze keine Bäume!
_________________
Wahnsinn ist nur die Antwort einer gesunden Psyche auf eine kranke Gesellschaft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 02.06.2008, 22:56    Titel: Antworten mit Zitat

du brauchst aber doch brennholz für deine höllenfeuer!
_________________
"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
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
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
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