string arrays

Previous topic - Next topic

didi

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 : 

Code (glbasic) Select
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 ?

S.O.P.M.

Wenn das dein gesamter Code ist, dann hast du das Array noch gar nicht dimensioniert! Du musst noch DIM vorher einsetzen.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

D2O

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.

Code (glbasic) Select
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
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

didi

Wenn mans weiß ist alles einfach -   Vielen Dank für die rasche Hilfe  :)

Schranz0r

#4
Oder man lässt es einfach offen ! Ja auch das kann GLBasic:


Code (glbasic) Select
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 :

Code (glbasic) Select
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

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

didi

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  ;) 

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

für "dauernd neu dimensionieren" gibt's übrigens REDIM - aber DIMPUSH ist 1. Wahl.

didi

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.

D2O

Was möchtest Du den damit machen, muss alles am Stück geladen werden oder kann man das Scheibchenweise
laden?
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello

Ja. Wenn man vorher schon weiß wie groß was ist, dann immer mit DIM arbeiten.

D2O

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:
Code (glbasic) Select

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
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

didi

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 .

didi

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 (")

Schranz0r

so:

Code (glbasic) Select
LOCAL MeinText$ = "Sie sagte: "+CHR$(34)+"Hallo Welt!"+CHR$(34)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard