Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
imja
Anmeldungsdatum: 15.06.2006 Beiträge: 7
|
Verfasst am: 17.06.2006, 15:42 Titel: Fehlermeldung: Index ausserhalb des Bereichs |
|
|
Hallo,
Warum können bei mir Arrays insgesamt nur 11000 Elemente haben?
Z.B. das geht noch: Code: | DIM a(11000) AS STRING |
oder das: Code: | DIM a(5000) AS STRING
DIM a(6000) AS STRING |
Dabei aber: Code: | DIM a(12000) AS STRING |
oder dabei: Code: | DIM a(6000) AS STRING
DIM a(6000) AS STRING | bekomme ich eine Fehlermeldung "Index ausserhalb des Bereichs"
Und wo sind die versprochenen 32767 Elemente?
Danke im voraus für eure Antwort |
|
Nach oben |
|
 |
Stormy

Anmeldungsdatum: 10.09.2004 Beiträge: 567 Wohnort: Sachsen - wo die schönen Frauen wachsen ;)
|
Verfasst am: 17.06.2006, 15:51 Titel: |
|
|
Strings verbrauchen mehr Speicher als andere Datentypen wie Integer oder Long, da ja schon jedes Zeichen 1 Byte groß ist.
Wozu brauchst du überhaupt so ein großes String-Array ? Um wirklich große Arrays behandeln zu können, kannst du auch FreeBASIC nehmen. Da ist der volle RAM zugreifbar (zB 512 MB und nicht mehr 640KB)
Falls du aber noch bei QBasic bleiben willst, dann starte qbasic mit dem parameter "/H" -> also: qbasic.exe /H
Die QBMonsterFAQ bietet dir auch weitere Tipps, wie man mit großen Arrays umgehen kann. _________________ +++ QB-City +++ Die virtuelle Stadt für jeden Freelancer - Join the community!
Projekte: QB-City,MysticWorld (RPG), 2D-OpenGL-Tutorial |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
imja
Anmeldungsdatum: 15.06.2006 Beiträge: 7
|
Verfasst am: 17.06.2006, 18:13 Titel: |
|
|
Danke, Stormy und Sebastian.
Stormy hat Folgendes geschrieben: |
Wozu brauchst du überhaupt so ein großes String-Array ? |
Ich denke wohl in falsche Richtung. Also:
Wenn ich erfahren will, ob ein Wort im Text mit 50 000 Wörtern vorhanden ist, so dauert es, sagen wir, 1 Sekunde: ich durchlaufe alle Zeilen mit
LINE INPUT #1, zeile$
Wenn ich aber nach 60 einzelnen Wörtern suche, dann dauert es 60 Sekunden (60mal Text durchlaufen). Und wenn ich nach ein paar Tausenden Wörtern suche... Wie kann man das beschleunigen?
Sowas machen auch Übersetzungsprogramme, welche Wort für Wort in einem grossen Wörterbuch nachschlagen. Wie schaffen sie das so schnell?
Durchlaufen sie das ganze Wörterbuch etwa nicht? |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 17.06.2006, 18:52 Titel: |
|
|
Beispiel:
26 Dateien.
A.txt
b.txt
c.txt
...
z.txt
So ähnlich, wie du wahrscheinlich ein Wörterbuch verwendest .
Oft verwendete Wörter kannst du in einem Array lagern.
(also z.B. ich du er sie ...)
Dann kannst du auch, jenach Fachgebiet das der Nutzer eingibt, eine andere Liste in ein Array einlesen.
Ich hoffe, es hilft dir weiter. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 17.06.2006, 19:50 Titel: |
|
|
Michael Freys Idee ist imo genau richtig, um die Performance zu erhöhen.
Übrigens: Selbst wenn du nur eine Datei hast und nach 60 Wörtern suchen willst, musst du die Liste nicht 60x neu durchlaufen.
Code: | DIM Suche$(1 TO 60)
OPEN "datei.txt" FOR INPUT AS #1
z&=1
DO UNTIL EOF(1)
LINE INPUT #1, Temp$
FOR i%=LBOUND(Suche$) TO UBOUND(Suche$)
IF UCASE$(Temp$) = UCASE$(Suche$(i%)) THEN
PRINT "Wort "; Suche$(i%)); " in Zeile "; LTRIM$(STR$(z&)); " gefunden."
END IF
NEXT i%
IF EOF(1) THEN EXIT DO
z&=z&+1
LOOP
CLOSE #1: SLEEP: END |
_________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 17.06.2006, 20:05 Titel: |
|
|
Etwas über den Tellerrand hinausgeschaut: Neuzeitlichere Programmiersprachen bieten dafür in der Regel ein Dictonary-Feldtyp an. Hierbei handelt es sich um eine Liste, wo man statt per numerischem Index wie beim QB-Array direkt mittels String auf das Element zugreift. Würde schematisch etwa so aussehen:
Code: | ' Nur Pseudo-Code! Nicht lauffähig in QB!
DIM a$ AS Dictionary
a$("Apfel") = "apple"
a$("Brot") = "bread"
PRINT a$("apfel") |
z.B. VBScript hat ein solches Dictonary-Objekt, welches dementsprechend schnell arbeitet. Auch PHP besitzt dies, Perl ebenso.
Intern arbeiten solche Dictionarys mit sog. Hashfunktionen z.B. Michael Frey hat in seiner Varianten die Hashfunktion Anfangsbuchstabe verwendet. => Man berechnet vom Index üblicherweise den Hashwert aus und greift dann auf die entsprechende Unterliste zu.
Der Rechenaufwand wird dabei auf Grössenordnung Quadratwurzel reduziert. Eine Million Einträge ohne Hash-Funktion: Etwa 500'000 Operationen durch lineares Suchen nötig. Mit Hash-Funktion: Hash berechnen (z.B. dies entspräche etwa 10 Vergleichsoperationen vom Rechenaufwand her), passender "Haufen" suchen (Annahme: Die 1 Millionen Datensätze sind in 1000 Hashlisten à 1000 Einträge organisiert) (500 Operationen), danach noch innerhalb des Hash-Haufens das Element suchen (=etwa 500 Operationen). => Total 1010 Operationen => ist gegenüber 500'000 Operationen bereits erheblich schneller.
Eine Suchmaschine wie Google kann eigentlich nur mit Hilfe solcher Algorithmen die vielen Suchanfragen bewältigen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
imja
Anmeldungsdatum: 15.06.2006 Beiträge: 7
|
Verfasst am: 18.06.2006, 17:24 Titel: |
|
|
vielen Dank an alle.
Geniale Idee - mit Unterlisten, so bewältige ich auch meine russisch-deutsche Wörterbücher.
Ich werde alle Wörter in alfabhetische Gruppen unterteilen. |
|
Nach oben |
|
 |
|