|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Deine Meinung? |
Sehr gut |
|
100% |
[ 1 ] |
Gut |
|
0% |
[ 0 ] |
Vielleicht nützlich |
|
0% |
[ 0 ] |
Gibts schon besser |
|
0% |
[ 0 ] |
nicht nützlich |
|
0% |
[ 0 ] |
sonstiges (posten) |
|
0% |
[ 0 ] |
|
Stimmen insgesamt : 1 |
|
Autor |
Nachricht |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 08.01.2010, 22:30 Titel: |
|
|
Wird gemacht.
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. |
|
Nach oben |
|
|
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 10.01.2010, 13:58 Titel: |
|
|
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. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 10.01.2010, 18:22 Titel: |
|
|
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 |
|
|
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 10.01.2010, 18:51 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4609 Wohnort: ~/
|
Verfasst am: 10.01.2010, 19:11 Titel: |
|
|
Ah, in Ordnung, danke. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 18.04.2010, 01:08 Titel: |
|
|
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.
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 |
|
|
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 18.04.2010, 10:41 Titel: |
|
|
49k% ist ja mal echt nett |
|
Nach oben |
|
|
The_Muh aka Mark Aroni
Anmeldungsdatum: 11.09.2006 Beiträge: 718
|
Verfasst am: 18.04.2010, 13:00 Titel: |
|
|
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 |
|
|
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 18.04.2010, 13:57 Titel: |
|
|
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 |
|
|
|
|
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.
|
|