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:

Fehlermeldung: Index ausserhalb des Bereichs

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
imja



Anmeldungsdatum: 15.06.2006
Beiträge: 7

BeitragVerfasst am: 17.06.2006, 15:42    Titel: Fehlermeldung: Index ausserhalb des Bereichs Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Stormy



Anmeldungsdatum: 10.09.2004
Beiträge: 567
Wohnort: Sachsen - wo die schönen Frauen wachsen ;)

BeitragVerfasst am: 17.06.2006, 15:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.06.2006, 17:47    Titel: Antworten mit Zitat

Derartig große Arrays würde ich unbedingt vermeiden, selbst in FreeBASIC, wo ich sie anlegen könnte. So viele Daten gehören in externe Dateien ausgelagert. Bei heutigen Computern merkt man da kaum einen Performanceverlust.
_________________

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
imja



Anmeldungsdatum: 15.06.2006
Beiträge: 7

BeitragVerfasst am: 17.06.2006, 18:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 17.06.2006, 18:52    Titel: Antworten mit Zitat

Beispiel:
26 Dateien.

A.txt
b.txt
c.txt
...
z.txt

So ähnlich, wie du wahrscheinlich ein Wörterbuch verwendest zwinkern.

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 17.06.2006, 19:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 17.06.2006, 20:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
imja



Anmeldungsdatum: 15.06.2006
Beiträge: 7

BeitragVerfasst am: 18.06.2006, 17:24    Titel: Antworten mit Zitat

vielen Dank an alle.
Geniale Idee lächeln - mit Unterlisten, so bewältige ich auch meine russisch-deutsche Wörterbücher. lächeln

Ich werde alle Wörter in alfabhetische Gruppen unterteilen.
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 QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
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