GLBasic forum

Other languages => GLBasic - de => Topic started by: didi on 2009-Dec-19

Title: string arrays
Post by: didi on 2009-Dec-19
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 ?
Title: Re: string arrays
Post by: S.O.P.M. on 2009-Dec-19
Wenn das dein gesamter Code ist, dann hast du das Array noch gar nicht dimensioniert! Du musst noch DIM vorher einsetzen.
Title: Re: string arrays
Post by: D2O on 2009-Dec-19
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
Title: Re: string arrays
Post by: didi on 2009-Dec-20
Wenn mans weiß ist alles einfach -   Vielen Dank für die rasche Hilfe  :)
Title: Re: string arrays
Post by: Schranz0r on 2009-Dec-20
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

Title: Re: string arrays
Post by: didi on 2009-Dec-20
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  ;) 
Title: Re: string arrays
Post by: Schranz0r on 2009-Dec-20
So ist das ;D
Title: Re: string arrays
Post by: Kitty Hello on 2009-Dec-21
für "dauernd neu dimensionieren" gibt's übrigens REDIM - aber DIMPUSH ist 1. Wahl.
Title: Re: string arrays
Post by: didi on 2009-Dec-21
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.
Title: Re: string arrays
Post by: D2O on 2009-Dec-22
Was möchtest Du den damit machen, muss alles am Stück geladen werden oder kann man das Scheibchenweise
laden?
Title: Re: string arrays
Post by: Kitty Hello on 2009-Dec-22
Ja. Wenn man vorher schon weiß wie groß was ist, dann immer mit DIM arbeiten.
Title: Re: string arrays
Post by: D2O on 2009-Dec-22
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
Title: Re: string arrays
Post by: didi on 2009-Dec-22
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 .
Title: Re: string arrays
Post by: didi on 2009-Dec-23
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 (")
Title: Re: string arrays
Post by: Schranz0r on 2009-Dec-23
so:

Code (glbasic) Select
LOCAL MeinText$ = "Sie sagte: "+CHR$(34)+"Hallo Welt!"+CHR$(34)
Title: Re: string arrays
Post by: didi on 2010-Jan-02
Hier mal ein Teil von dem was ich bisher programmiert haben - soll mal für alles mögliche verwendet werden .

String-Array-Funktionen :

Code (glbasic) Select
// --------------------------------- //
// 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
Title: Re: string arrays
Post by: BumbleBee on 2010-Jan-02
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