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:

Listen in FreeBasic
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  

Deine Meinung?
Sehr gut
100%
 100%  [ 1 ]
Gut
0%
 0%  [ 0 ]
Vielleicht nützlich
0%
 0%  [ 0 ]
Gibts schon besser
0%
 0%  [ 0 ]
nicht nützlich
0%
 0%  [ 0 ]
sonstiges (posten)
0%
 0%  [ 0 ]
Stimmen insgesamt : 1

Autor Nachricht
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 08.01.2010, 22:30    Titel: Antworten mit Zitat

Wird gemacht. lächeln
Hab übrigens gerade noch 3 Klassen fertig, die sind nicht ganz so wichtig wie die ersten zwei, aber trotzdem nützlich.

FBDate:
Datumsberechnung, Vergleich, Tagesnamen, und vieles andere. Ohne vbcombat und plattformunabhängig.

FBTime:
Zeitberechnungen, Zeitmessung, Stoppuhr, Performance Messung.

FBColor:
Farbrechnung, korrekte aufhellung von Farben, in Grauwert umrechnen, an Stelle von dword und uinteger benutzbar.

Bei interesse lad ich die gern auch hoch.
Es sind schon 5 Types, fast eine Bibliothek. grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 10.01.2010, 13:58    Titel: Antworten mit Zitat

Hab jetzt selber mit der Map mal gearbeitet, und mir gefällt das benutzen selbst gut.
Aber wenn man denkt man kann nur Werte mit anderen Werten verbinden hat man sich getäuscht.
Man kann auch sein Programm organisieren.
Das Beispiel zeigt was ich meine:
Code:
#include once "listType.bi"
#include once "fbmap.bi"
#include once "list.bi"

#define callSlots(a) dim as uinteger pointer_to_sub_list = signal_slot_map.value(cast(uinteger,a),0) : dim as list ptr pointer_to_list = cast(list ptr,pointer_to_sub_list) : if pointer_to_list <> 0 then : if pointer_to_list->c > 0 then : for fb_i as integer = 1 to pointer_to_list->c : dim as uinteger pointer_to_slot = cast(uinteger, pointer_to_list->value(fb_i)) : dim as sub (byval m as Map) pointer_to_sub = cast(sub (byval m as Map),pointer_to_slot) : pointer_to_sub(Map) : next : end if : end if

#define connect(a,b) if signal_slot_map.contains(cast(uinteger,a)) then : dim as uinteger pointertosublist = signal_slot_map.value(cast(uinteger,a))  : dim as list ptr pointertolist = cast(list ptr,pointertosublist) : pointertolist->append(cast(uinteger,b)) : else : dim as list ptr l = new list : l->add(cast(uinteger,b)) : signal_slot_map.add(cast(uinteger,a),cast(uinteger,l)) : end if

#define disconnect(a,b) if signal_slot_map.contains(cast(uinteger,a)) then : dim as uinteger pointertosublist = signal_slot_map.value(cast(uinteger,a))  : dim as list ptr pointertolist = cast(list ptr,pointertosublist) : pointertolist->removeAll(cast(uinteger,b)) : end if

#define disconnectAll(a) if signal_slot_map.contains(cast(uinteger,a)) then : dim as uinteger pointertosublist = signal_slot_map.value(cast(uinteger,a))  : dim as list ptr pointertolist = cast(list ptr,pointertosublist) : pointertolist->clear() : pointertolist->remove(1) : end if

dim shared signal_slot_map as map

sub slot1 (byval m as Map)
    print "Hallo"
end sub

sub slot2 (byval m as Map)
    print "Welt"
end sub

sub slot3 (byval m as Map)
    print "Freebasic"
end sub

sub slot4 (byval m as Map)
    print "Liste"
end sub

sub slot5 (byval m as Map)
    print "Map"
end sub

sub slot6 (byval m as Map)
    print "FB"
end sub



sub signal1 ()
     callSlots(@signal1)
end sub

sub signal2 ()
     callSlots(@signal2)
end sub

sub signal3 ()
     callSlots(@signal3)
end sub

sub signal4 ()
     callSlots(@signal4)
end sub


dim as integer nummer = 0
dim as integer nummer2 = 0
dim as integer nummer3 = 0
dim as Map slotm
dim as Map signalm

slotm.add(1,cast(uinteger,@slot1))
slotm.add(2,cast(uinteger,@slot2))
slotm.add(3,cast(uinteger,@slot3))
slotm.add(4,cast(uinteger,@slot4))
slotm.add(5,cast(uinteger,@slot5))
slotm.add(6,cast(uinteger,@slot6))

signalm.add(1,cast(uinteger,@signal1))
signalm.add(2,cast(uinteger,@signal2))
signalm.add(3,cast(uinteger,@signal3))
signalm.add(4,cast(uinteger,@signal4))

do
    cls
    print "1. Verbinden"
    print "2. Trennen"
    print "3. Ausfuehren"
    print "4. Beenden"
    input nummer
   
    if nummer = 1 then
        cls
        print "Welches Signal?"
        print "1. signal1"
        print "2. signal2"
        print "3. signal3"
        print "4. signal4"
        input nummer2
        cls
        if nummer2 > 4 or nummer2 < 1 then
            print "Fehler!"
            sleep
            cls
            continue do
        end if
        print "Welches Signal?"
        print "1. slot1"
        print "2. slot2"
        print "3. slot3"
        print "4. slot4"
        print "5. slot5"
        print "6. slot6"
        input nummer3
        if nummer3 > 6 or nummer2 < 1 then
            print "Fehler!"
            sleep
            cls
            continue do
        end if
       
        connect(cast(uinteger,signalm.value(nummer2)),cast(uinteger,slotm.value(nummer3)))
   
    elseif nummer = 2 then
        cls
        print "Welches Signal?"
        print "1. signal1"
        print "2. signal2"
        print "3. signal3"
        print "4. signal4"
        input nummer2
        cls
        if nummer2 > 4 or nummer2 < 1 then
            print "Fehler!"
            sleep
            cls
            continue do
        end if
        print "Welches Signal?"
        print "1. slot1"
        print "2. slot2"
        print "3. slot3"
        print "4. slot4"
        print "5. slot5"
        print "6. slot6"
        input nummer3
        if nummer3 > 6 or nummer2 < 1 then
            print "Fehler!"
            sleep
            cls
            continue do
        end if
       
        disconnect(cast(uinteger,signalm.value(nummer2)),cast(uinteger,slotm.value(nummer3)))
   
    elseif nummer = 3 then
        cls
        print "Welches Signal?"
        print "1. signal1"
        print "2. signal2"
        print "3. signal3"
        print "4. signal4"
        input nummer2
        cls
        if nummer2 > 4 or nummer2 < 1 then
            print "Fehler!"
            sleep
            cls
            continue do
        end if
        dim as uinteger s = cast(uinteger,signalm.value(nummer2))
        dim as sub() s2 = cast(sub(),s)
        s2()
        sleep
       
    elseif nummer = 4 then
        signalm.clear()
        slotm.clear()
        signal_slot_map.clear()
        end
    end if
loop


Im Beispiel kann man Signale mit Slots verbinden oder trennen oder Signale starten.
Am besten einfach mal kompilieren, dann sieht man was gemeint ist.
Man kann Funktionen mit anderen Funktionen verbinden, und beim Aufruf werden durch eine Zeile alle gerade verbunden Funktionen ausgeführt.
Man kann aber auch ganz dynamisch Funktionen wieder trennen.
Ich finds praktisch. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4609
Wohnort: ~/

BeitragVerfasst am: 10.01.2010, 18:22    Titel: Antworten mit Zitat

Ich kenne den Datentyp Map selbst nicht, er erinnert mich an Hashes. Was mich da aber irritiert, ist, dass Schlüssel nicht eindeutig sein müssen.
Code:
#include "fbmap.bi"
dim as Map l
l.add("key", "alt")
l.add("key", "neu")
print "Zahl der Elemente:"; cast(integer,l.count())

Ist das Absicht?
Ich hätte manchmal gern eine einfache Möglichkeit, je nachdem einen Wert dazuzufügen bzw. zu ersetzen, ohne immer selbst eine Kontrolle durchführen zu müssen. (Habe ich mir natürlich was einfaches zusammen gezimmert, könnte aber auch schon drin sein.)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 10.01.2010, 18:51    Titel: Antworten mit Zitat

Bei QMap (die ja das Vorbild war) gibt es Funktionen, die ich noch schreiben muss, bei denen es durchaus Sinn macht, dass Schlüssel nicht eindeutig sein müssen.
Wenn du das nicht prüfen willst nimm Map.insert().
Die Parameter sind gleich aber Map.insert() überprüft ob der Schlüssel schon verwendet wird und wenn ja wird er überschrieben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4609
Wohnort: ~/

BeitragVerfasst am: 10.01.2010, 19:11    Titel: Antworten mit Zitat

Ah, in Ordnung, danke. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 18.04.2010, 01:08    Titel: Antworten mit Zitat

Da nemored die Liste in seinem aktuellen Spiel verwendet hab ich mir mal die Performence der Liste genauer angesehen und bin auf erhebliche Mängel gestoßen. Allein das Hinzufügen von 100 000 Elementen dauert 3 Stunden, das erzeugen einer größeren Teilliste dauert noch länger. Ausserdem lassen sich recht leicht Speicherfehler erzeugen. Also hab ich die Liste überarbeitet und kann auch von einem Performenceschub berichten: die alte Liste hat zum hinzufügen von 100 000 Elementen fast exakt 3 Stunden oder 10800s gebraucht. Die neue Liste schafft das Gleiche in ganzen 0.2s, ist also ca 49540% schneller. happy
Auch Dinge wie das Löschen zufälliger Elemente oder ähnliches wurde erheblich beschleunigt. Gegen die Speicherfehler wurden einige IF-Abfragen eingebaut und die Kopie einer Liste zeigt nicht mehr auf das erste Element der Quellliste.
Der Quelltext befindet sich im NoPaste, hier, und ist für Strings geschrieben. Die Version für jeden Datentyp kommt noch.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 18.04.2010, 10:41    Titel: Antworten mit Zitat

49k% ist ja mal echt nett grinsen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The_Muh
aka Mark Aroni


Anmeldungsdatum: 11.09.2006
Beiträge: 718

BeitragVerfasst am: 18.04.2010, 13:00    Titel: Antworten mit Zitat

Wie genau funktiniert die Liste? Ich hab gestern abend versucht den Quelltext nachzuvollziehen... aber da ruft ja eine funktion die nächste auf - das scheint kein ende zu nehmen. Dann hab ich nach 10 minuten rumscrollen keine lust mehr...

Meine liste ist nämlich nicht wirklich schnell, aber hat genauso viele Features wie ich brauche und keines mehr.
_________________
// nicht mehr aktiv //
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 18.04.2010, 13:57    Titel: Antworten mit Zitat

Also:
Die Liste hat 3 Variablen für den Zugriff. Einen Zeiger auf das erste Element, einen Zeiger auf das letzte Element und einen Zeiger auf das Element auf das zuletzt zugegriffen wurde.
Nur 2 Funktionen sind wirklich eigenständig: itemAt und insert.
Alle anderen Funktionen sind größtenteils aus diesen zwei Funktionen gebaut (zb. append("Wert") = insert(count(),"Wert")). itemAt ermittelt zuerst welcher der drei Zugriffszeiger am nächsten ist. Danach wird noch die Richtung bestimmt (vorwärts, rückwärts oder treffer). Dann wird solange in die Richtung gegangen bis man am gewollten Index ist. Insert macht das gleiche, fügt aber noch ein neues Item an die stelle ein. Nach dem Zugriff über itemAt oder insert wird der Zeiger auf das letzte verwendete Item auf das zurückgegebene bzw. eingefügte Item gesetzt.
Wenn man die beiden Funktionen versteht ist der Rest einfach. Es reicht auch zu wissen was die beiden Funktionen tun um die anderen zu verstehen.
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 -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 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