Variablenname als Variable
Variablenname als Variable
Problem: Wort aus (langer) Wortliste schnell finden.
Gibt es die Möglichkeit einen Datazugriff variabel zu gestalten? Also je nach Anfangsbuchstabe$ erfolgt der Zugriff auf eine andere DataSection?
-----------------------------------------------
Anfangsbuchstabe$ = "B"
Restore Anfangsbuchstabe$ ; Gibt ERROR! Je nach Buchstabe, soll aber in der richten Liste gelesen werden
Read Wort$
Debug Wort$
DataSection
A:
Data.s "Apfel", "Auto", "Axt"
B:
Data.s "Baum", "Berg", "Birne", "Bohne"
C:
Data.s "Charme", "China"
EndDataSection
-----------------------------------------------
Gibt es die Möglichkeit einen Datazugriff variabel zu gestalten? Also je nach Anfangsbuchstabe$ erfolgt der Zugriff auf eine andere DataSection?
-----------------------------------------------
Anfangsbuchstabe$ = "B"
Restore Anfangsbuchstabe$ ; Gibt ERROR! Je nach Buchstabe, soll aber in der richten Liste gelesen werden
Read Wort$
Debug Wort$
DataSection
A:
Data.s "Apfel", "Auto", "Axt"
B:
Data.s "Baum", "Berg", "Birne", "Bohne"
C:
Data.s "Charme", "China"
EndDataSection
-----------------------------------------------
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
löse es nicht per DATA, sondern erstelle die wortliste in einem Array oder einer LinkedList.
dann kannst du elemente sortieren und suchen.
um das mit Data zu lösen, müsstest du ein komplexes Select/Case bauen:
Restore kann nun mal keine Variablen verarbeiten, da die Labals zur Laufzeit nicht in Klarschrift, sondern nur noch als Pointer vorliegen.
evtl. gibt es auch eine möglichkeit, ein pointerarray zu erstellen...
aber das würde nicht soo viel bringen, da du trotz des immensen aufwands jeden buchstabenblock von vorne durchsuchen müsstest.
da wärest du mit einer fortlaufenden liste und einem guten suchalgorithmus besser bedient...
dann kannst du elemente sortieren und suchen.
um das mit Data zu lösen, müsstest du ein komplexes Select/Case bauen:
Code: Alles auswählen
Select Asc(Anfangsbuchstabe$)
Case 65
Restore A
Case 66
Restore B
Case 67
Restore C
...
Case 90
Restore Z
EndSelect
evtl. gibt es auch eine möglichkeit, ein pointerarray zu erstellen...
aber das würde nicht soo viel bringen, da du trotz des immensen aufwands jeden buchstabenblock von vorne durchsuchen müsstest.
da wärest du mit einer fortlaufenden liste und einem guten suchalgorithmus besser bedient...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Vielleicht hilft auch sowas:
Code: Alles auswählen
Structure Dictionary
key.s
value.s
EndStructure
Global NewList Dictionary.Dictionary()
Procedure DictPut(key.s, value.s); Add a key with value ( value "" removes the key)
Protected Found.l
If CountList(Dictionary())
ForEach Dictionary()
If UCase(Dictionary()\key) = UCase(key)
If value > ""
Dictionary()\value = value
Else
DeleteElement(Dictionary())
EndIf
Found = #True
Break
EndIf
Next
EndIf
If Not Found
AddElement(Dictionary())
Dictionary()\key = key
Dictionary()\value = value
EndIf
EndProcedure
Procedure.s DictGet(key.s); return the value of key or "" if failed
If CountList(Dictionary())
ForEach Dictionary()
If UCase(Dictionary()\key) = UCase(key)
ProcedureReturn Dictionary()\value
EndIf
Next
EndIf
ProcedureReturn ""
EndProcedure
DictPut("Auto", "VW-Käfer")
DictPut("Fahrrad", "Dreirad")
DictPut("Variable", "Wert")
DictPut("Äpfel", "3")
Debug DictGet("Äpfel")
Debug DictGet("Fahrrad")
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Noch ein Nachtrag, vielleicht gibt es ja weiter Vorschläge für einen besseren Suchalgorithmus.
Das Ganze soll ein Übersetzungsprogramm für Esperanto werden. Meine Wortliste sieht so aus (ca. 60000 Zeilen):
abako rechenbrett
abandono verzicht
abatiso verhau
abato abt
...
zumuleto summbienchen
zumzumi brummen
zumzumo gesumm
Ich möchte die Liste gerne im Programmcode integrieren und nicht als separate Datei einlesen, daher die "Data" Lösung.
Mit PB habe ich mir ein Programm geschrieben, das mir die Liste als passenden Data-Text ausgibt und auch nach Buchstaben separiert:
A:
Data.s "abako rechenbrett","abandono verzicht","abatiso verhau","abato abt" ...
B:
Data.s "babao rosinenkuchen","babilacxi faseln", ..
mit 4000 Wörtern in einer Data-Zeile geht es nämlich noch. Mit 60000 ging es nicht mehr.
Gibt es noch andere Lösungen, die Übersetzung eines Wortes schnell zu finden?
Das Ganze soll ein Übersetzungsprogramm für Esperanto werden. Meine Wortliste sieht so aus (ca. 60000 Zeilen):
abako rechenbrett
abandono verzicht
abatiso verhau
abato abt
...
zumuleto summbienchen
zumzumi brummen
zumzumo gesumm
Ich möchte die Liste gerne im Programmcode integrieren und nicht als separate Datei einlesen, daher die "Data" Lösung.
Mit PB habe ich mir ein Programm geschrieben, das mir die Liste als passenden Data-Text ausgibt und auch nach Buchstaben separiert:
A:
Data.s "abako rechenbrett","abandono verzicht","abatiso verhau","abato abt" ...
B:
Data.s "babao rosinenkuchen","babilacxi faseln", ..
mit 4000 Wörtern in einer Data-Zeile geht es nämlich noch. Mit 60000 ging es nicht mehr.
Gibt es noch andere Lösungen, die Übersetzung eines Wortes schnell zu finden?
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
es gibt die sogenannte index-binäre suchmethode.
du könntest genauso ein Array oder eine Liste verwenden, wenn du die Daten in Data-Zeilen übergibst, du kannst sie zu beginn der programmausführung aus den DATA in z.b. ein Array lesen.
die index-binäre suchmethode funktioniert folgendermaßen:
du schaust zuerst in die mitte deiner Datei (also, in Begriff 30000)
dann vergleichst du, ob dein Wort größer oder kleiner ist. (also nachher oder vorher im alphabeth kommt)
wenn vorher, schaust du in die mitte deiner ersten hälfte (also 15000)
wenn nachher, in dir mitte der zweiten hälfte (also 45000)
dann vergleichst du wieder, und halbierst wieder.
so springst du in immer kleineren schritten in deiner datei hin und her,
bis du den richtigen begriff gefunden hast.
damit brauchst du wesentlich weniger zugriffe, als wenn du von vorne oder hinten linear suchen würdest,
und du bist auch auf keine bestimmte struktur angewiesen, um einen guten einsprungpunkt zu finden.
du könntest genauso ein Array oder eine Liste verwenden, wenn du die Daten in Data-Zeilen übergibst, du kannst sie zu beginn der programmausführung aus den DATA in z.b. ein Array lesen.
die index-binäre suchmethode funktioniert folgendermaßen:
du schaust zuerst in die mitte deiner Datei (also, in Begriff 30000)
dann vergleichst du, ob dein Wort größer oder kleiner ist. (also nachher oder vorher im alphabeth kommt)
wenn vorher, schaust du in die mitte deiner ersten hälfte (also 15000)
wenn nachher, in dir mitte der zweiten hälfte (also 45000)
dann vergleichst du wieder, und halbierst wieder.
so springst du in immer kleineren schritten in deiner datei hin und her,
bis du den richtigen begriff gefunden hast.
damit brauchst du wesentlich weniger zugriffe, als wenn du von vorne oder hinten linear suchen würdest,
und du bist auch auf keine bestimmte struktur angewiesen, um einen guten einsprungpunkt zu finden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Warum nicht direkt so?Kaeru Gaman hat geschrieben:Code: Alles auswählen
Select Asc(Anfangsbuchstabe$) Case 65 Restore A Case 66 Restore B Case 67 Restore C ... Case 90 Restore Z EndSelect
Code: Alles auswählen
Select Anfangsbuchstabe$
Case "A"
Restore A
Case "B"
Restore B
Case "C"
Restore C
EndSelect
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- hardfalcon
- Beiträge: 3447
- Registriert: 29.08.2004 20:46