Hallo !
bin gerade dabei Text zu verarbeiten, schön wäre dafür ein string-array, aber egal wie ich es anfange es gibt einen "fatal error" - Mini-Beispiel :
PRINT "Hello! " , 0, 30
x$ = "Hallo!"
PRINT x$ , 0, 40
x$[0] = "Welcome!"
// PRINT x$[0], 0, 50
Problem ist die Zeile mit "x$[0] " ( Prog-version 7.203)
Hat jemand eine Idee was nicht stimmt bzw. wie man's richtig macht ?
Wenn das dein gesamter Code ist, dann hast du das Array noch gar nicht dimensioniert! Du musst noch DIM vorher einsetzen.
Jepp, schaut ganz danach aus,
und nicht die Variablen so mischen.
Du benutzt x$ als Normale String Variable und gleich darauf soll es ein Array werden, x$[].
Das geht so nicht.
Hier mal Dein Beispielcode umgeschrieben das es Funktioniert.
GLOBAL x$[] /// Array Global erstellen
DIM x$[1] /// Array Demensionieren, 1Feld gross
GLOBAL string$ /// Neue Variable anstatt x$
PRINT "Hello! " , 0, 30
string$ = "Hallo!"
PRINT string$ , 0, 40
x$[0] = "Welcome!" //Das erste Feld ist 0, da nicht 1,2...3 gezählt wird
//sondern 0,1,2,....3. OK ;)
PRINT x$[0], 0, 50
SHOWSCREEN // Das ganze anzeigen
KEYWAIT
Wenn mans weiß ist alles einfach - Vielen Dank für die rasche Hilfe :)
Oder man lässt es einfach offen ! Ja auch das kann GLBasic:
GLOBAL Strings$[] // Array offen lassen
LOCAL String$ = "Hallo das ist ein kleiner Text zum testen"
SPLITSTR(String$, Strings$[]," ") // Strings beim Leerzeichen zerteilen!
WHILE TRUE
FOR i = 0 TO LEN(Strings$[])-1
PRINT Strings$[i],10,i*20
NEXT
SHOWSCREEN
WEND
END
oder so :
GLOBAL Strings$[] // Array offen lassen
PushString("Das")
PushSpace()
PushString("ist")
PushSpace()
PushString("ein")
PushSpace()
PushString("kleiner")
PushSpace()
PushString("test")
PushSpace()
PushString("!")
WHILE TRUE
FOR i = 0 TO LEN(Strings$[])-1
PRINT Strings$[i],10,i*20
NEXT
SHOWSCREEN
WEND
END
FUNCTION PushString: text$
DIMPUSH Strings$[], text$
ENDFUNCTION
FUNCTION PushSpace:
DIMPUSH Strings$[], " "
ENDFUNCTION
Toller Hinweis !
Genau das war jetzt mein nächstes Problem , weil ich beliebig grosse Textfiles laden und verarbeiten möchte, weiss ich im voraus nicht wieviel ich bei DIM reservieren soll bzw. hätte laufend neu DIMmen müssen - nichts ist unmöglich ... GLBasic ;)
So ist das ;D
für "dauernd neu dimensionieren" gibt's übrigens REDIM - aber DIMPUSH ist 1. Wahl.
http://www.gutenberg.org/files/2600/old/wrnpc12.txt (http://www.gutenberg.org/files/2600/old/wrnpc12.txt)
Das ist das englische Buch "War and Peace" - "Krieg und Frieden" , wenn ich das zeilenweise ( 67403 Zeilen ) in ein Array einlese, das vorher geDIMmt wurde dauert das nur 200ms Rechenzeit , DIMPUSH meldet sich erst mal nicht mehr ;)
Bei 1000 Zeilen sinds mit DIM 3ms und über DIMPUSH 254ms .
Dh. am schnellsten geht es wohl vorher die Arraygrösse zu bestimmen.
Was möchtest Du den damit machen, muss alles am Stück geladen werden oder kann man das Scheibchenweise
laden?
Ja. Wenn man vorher schon weiß wie groß was ist, dann immer mit DIM arbeiten.
So, vom Einkauf zurück.
In dem Text gibt es wunderbare "Marker", hier z.b. das Wort "CHAPTER".
Du kannst nun nach Kapitel einzelne Dateien erstellen, die sind nur ein paar KB gross.
Die kann man nun sehr schnell Laden.
Das erstellen geht auch ratz fatz.
Ich habe hier das LIMITFPS auf 2000 gesetzt, da ich auch sehen wollte ob was passiert.
Da hier ja eine Grafikausgabe stattfindet wird das ganze natürlich auch von der FPS dem enstsprechent "ausgebremmst".
Hier mal ein Beispielcode:
LIMITFPS 2000
ok% = OPENFILE(0,"kuf.txt",TRUE)
GLOBAL a$
GLOBAL count%
OPENFILE(1,"kuf_"+count%+".txt",FALSE)
WHILE ENDOFFILE(0) = 0
READLINE 0,a$
IF INSTR(a$,"CHAPTER") <> -1
CLOSEFILE 1
INC count%,1
OPENFILE(1,"kuf_CHAPTER"+count%+".txt",FALSE)
ENDIF
WRITELINE 1,a$
PRINT a$,0,10
PRINT count%,0,50
SHOWSCREEN
WEND
CLOSEFILE 0
CLOSEFILE 1
Vielen Dank für die rege Diskussion :)
Falls es was wird werde ich euch das fertige Programm zeigen - im Moment bin ich noch am Lernen. Die Idee unbekannt grosse Texte zu teilen finde ich gut .
Eine Frage noch - wie kann ich die Gänsefüsschen in ein String bringen ?
anzahl% = SPLITSTR( lines$[0], words$[], " .,:")
hiermit kann ich nur die Worte ohne Satzzeichen raus-splitten bis auf das (")
so:
LOCAL MeinText$ = "Sie sagte: "+CHR$(34)+"Hallo Welt!"+CHR$(34)
Hier mal ein Teil von dem was ich bisher programmiert haben - soll mal für alles mögliche verwendet werden .
String-Array-Funktionen :
// --------------------------------- //
// Project: text-tool-box
// Start: Saturday, January 02, 2010
// IDE Version: 7.203
// www.dmemos.de January 02, 2010
GLOBAL fok%, digit$, lowercase_letter$, uppercase_letter$, letter$, whitespace$
GLOBAL punctuation$, brackets$, operators$, specialchars$
GLOBAL anarray$[], astring$, anotherstring$
minit() // default settings
astring$ = "Silbermond"
explode_to_chars( astring$ , anarray$[] )
PRINT "explodes a string to a char-array " , 0, 0
PRINT "input : " + astring$ , 0, 15
print_array( anarray$[] )
PRINT "implodes a char- or string array to a string " , 0, 0
anotherstring$ = implode_to_string$( anarray$[] )
PRINT anotherstring$ , 0, 15
SHOWSCREEN
MOUSEWAIT
astring$ = "an,alle,Krieger,des,Lichts,steht,auf,steht,alle,auf"
make_array_from_list( anarray$[], astring$ , "," )
PRINT "makes an array out of a list in a string", 0, 0
PRINT "input: " + astring$ , 0, 15
print_array( anarray$[] )
sort_string_array_casesensitive( anarray$[] )
PRINT "sorts the strings in an array casesensitive", 0, 0
print_array( anarray$[] )
sort_string_array_lowercase( anarray$[] )
PRINT "sorts the strings in an array and changes to lowercase", 0, 0
print_array( anarray$[] )
astring$ = "an,alle,Krieger,des,Lichts,steht,auf,steht,alle,auf"
make_array_from_list( anarray$[], astring$ , "," )
sort_string_array( anarray$[] )
PRINT "sorts the strings in an array not casesensitive", 0, 0
print_array( anarray$[] )
unify_string_array( anarray$[] )
PRINT "unifys the strings in a sortd array - deletes duplicates", 0, 0
print_array( anarray$[] )
PRINT " BYE ! " , 0, 0
SHOWSCREEN
MOUSEWAIT
END
FUNCTION print_array: marray$[]
LOCAL i%
lenarr = LEN( marray$[] )
FOR i% = 0 TO lenarr-1
PRINT "i: " + i + " " + marray$[i%], 0, (i%*15)+30
NEXT
SHOWSCREEN
MOUSEWAIT
ENDFUNCTION // PRINT_ARRAY
FUNCTION element_of_string: x$, string$
// returns TRUE if x$ is element of string
IF INSTR( string$, x$ ) = -1
RETURN FALSE
ELSE
RETURN TRUE
ENDIF
ENDFUNCTION // ELEMENT_OF_STRING
FUNCTION element_of_array: x$, marray$[]
// returns TRUE if x$ is element of array
LOCAL lenarr%, i%
lenarr = LEN(marray$[])
FOR i= 0 TO lenarr-1
IF marray$[i] = x$
RETURN TRUE
ENDIF
NEXT
RETURN FALSE
ENDFUNCTION // ELEMENT_OF_ARRAY
FUNCTION element_of_list: x$, string$ , separator$
// returns TRUE if x$ is element of list
// list representeted in string$, where elements are separated
LOCAL marray$[]
IF separator$ = ""
separator$ = " "
ENDIF
SPLITSTR( string$, marray$[], separator$)
RETURN element_of_array( x$, marray$[] )
ENDFUNCTION // ELEMENT_OF_LIST
FUNCTION make_array_from_list: marray$[], string$, separator$
// makes array of list
// list representeted in string$, where elements are separated
// by default with " " space , or any other one or more chars in
IF separator$ = ""
separator$ = " "
ENDIF
SPLITSTR( string$, marray$[], separator$)
ENDFUNCTION // MAKE_ARRAY_FROM_LIST
FUNCTION minit:
digit$ = "0123456789"
lowercase_letter$ = "abcdefghijklmnopqrstuvwxyz"
uppercase_letter$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
letter$ = lowercase_letter$ + uppercase_letter$
whitespace$ = " " + CHR$(9) + CHR$(13) + CHR$(10) // SPACE,TAB,CR,LF
punctuation$ = ".,:;!?'" + CHR$(34) // and "
brackets$ = "()[]{}"
operators$ = "+-/*^<>="
specialchars$ = "Ã,§$%&@"
fok% = SETCURRENTDIR("c:\\glbasic\\glbasic")
LOADFONT "FontCourier8x16.png", 1
SETFONT 1
ENDFUNCTION // MINIT
FUNCTION explode_to_chars: in$, marray$[]
LOCAL lenin%, i%
// by reference marray$[]
lenin%= LEN(in$)
REDIM marray$[lenin]
FOR i% = 0 TO lenin%-1
marray$[i%] = MID$( in$, i% , 1 )
NEXT
RETURN lenin%
ENDFUNCTION // explode_to_chars$
FUNCTION implode_to_string$: marray$[]
LOCAL x$, lenin%, i%
x$=""
lenin% = LEN(marray$[])
FOR i% = 0 TO lenin-1
x$ = x$+ marray$[i%]
NEXT
RETURN x$
ENDFUNCTION // implode_to_string$
FUNCTION sort_string_array_casesensitive: marray$[]
SORTARRAY marray$[] , 0
ENDFUNCTION // sort_string_array_casesensitive
FUNCTION sort_string_array_lowercase: marray$[]
LOCAL x$, lenin%, i%
x$=""
lenin% = LEN( marray$[])
FOR i% = 0 TO lenin-1
marray$[i%] = LCASE$( marray$[i%] )
NEXT
SORTARRAY marray$[] , 0
ENDFUNCTION // sort_string_array_lowercase
FUNCTION sort_string_array: marray$[]
LOCAL h$, n%, i%, j%, k%
// Bubblesort
h$ = ""
n = LEN(marray$[]) - 1
i = 0
j = 0
FOR i = 0 TO n
FOR j = n TO i%+1 STEP -1
IF UCASE$(marray$[i]) > UCASE$(marray$[j])
h$ = marray$[i]
marray$[i] = marray$[j]
marray$[j] = h$
ENDIF
NEXT
NEXT
h$ = ""
ENDFUNCTION //sort_string_array
FUNCTION unify_string_array: marray$[]
LOCAL lenin%, i%, j%, fDbl%
lenin%= LEN(marray$[])
// unify - every string only once - delete duplicates - redim array
i% = 1 // first possible string duplicate
j% = 0 // first char
fDbl%= FALSE
FOR i=0 TO lenin%-2
IFmarray$[i] = marray$[i+1]
fDbl = TRUE
ELSE
j = j+1
ENDIF
IF fDbl=TRUE
marray$[j] = marray$[i+1]
ENDIF
NEXT
j = j+1
REDIM marray$[j]
RETURN j
ENDFUNCTION // unify_strings_in_inout
(http://www.dmemos.de/glbasic/FontCourier8x16.png)
PS : bin mir nicht sicher wo ich das am besten posten sollte
Quote
bin mir nicht sicher wo ich das am besten posten sollte
Könntest es ja zum Beispiel dann in den Codeschnipsel Bereich rein tun. =D
Cheers