Seite 1 von 1

Nth of String (JS: string[N])

Verfasst: 31.07.2014 20:15
von Derren
Habe mir mal Gedanken gemacht, wie man den direkten Zugriff auf einen Charakter in einer Zeichenkette ähnlich wie in JavaScript bewerkstelligen kann.

Code: Alles auswählen

//JavaScript Code
var myString = 'Hallo Welt';

var Fourth = myString(0); // 'H' - Counter startet bei 0
var Fifth = myString(4); // 'o'
Heraus gekommen ist das hier. Ich habe versucht PeekC() zu umgehen und direkt per Pointer drauf zuzugreifen (zweckes Geschwindigkeit), aber innerhalb eines Macros ist es mir nicht gelungen. Und in einer Prozedure wäre der Geschwindgeitsvorteil wegen der Rumspringerei wieder weg (denke ich).

Code: Alles auswählen

Macro Nth(_string,pos)
	Chr(PeekC(_string+(pos*SizeOf(Character))))
EndMacro

Define myString.s = "Hallo Welt"

Debug Nth(@"Hallo Welt", 0)	; "H"
Debug Nth(@myString, 4) 	; "o"
Debug Nth(@"PureBasic", 0)	; "P"
Wichtig ist nur, dass man das @ nicht vergisst.
Aber es scheint dann wenigstens keinen IMA zu geben, sondern direkt einen Compiler Error.
Parenthesis '(' are not allowed in string operations.
Zumindest beim Direktzugriff. Bei einem Umweg über Pointer gibt es einen IMA.

Code: Alles auswählen

*ptr = @myString
*ptr=1 ;Verursacht logischerweise einen IMA
Debug Nth(*ptr, 1)
Vielleicht weiß ja einer von den Profies hier, ob/wie man das verbessern kann. Schneller, sicherer, etc. Falls ich nicht der einzige bin, der so eine Funktion nützlich findet^^

Re: Nth of String (JS: string[N])

Verfasst: 31.07.2014 20:38
von NicTheQuick
Wieso wolltest du das @ nicht mit ins Macro schreiben?

Code: Alles auswählen

 Macro Nth(_string,pos)
   Chr(PeekC(@_string+(pos*SizeOf(Character))))
EndMacro

Define myString.s = "Hallo Welt"

Debug Nth("Hallo Welt", 0)   ; "H"
Debug Nth(myString, 4)    ; "o"
Debug Nth("PureBasic", 0)   ; "P" 

Re: Nth of String (JS: string[N])

Verfasst: 31.07.2014 20:48
von Derren
Frag mich nicht. Daran hab ich gar nicht gedacht. :allright:

Re: Nth of String (JS: string[N])

Verfasst: 31.07.2014 21:33
von hjbremer

Code: Alles auswählen

;Zeiger auf Strings

Structure t_CHAR     
   s.s {1}[0]    
EndStructure 

a$ = "Hallo, dies ist ein Test" 

*z.t_char = @a$

For j = 0 To Len(a$) - 1
   Debug *z\s[j]
Next

Debug "----------------------"
Debug "erweitert um Asciicode"

Structure tt_CHAR 
   StructureUnion 
      s.s {1}[0] 
      c.c [0]
   EndStructureUnion 
EndStructure 

a$ = "Hallo, dies ist ein Test" 

*zz.tt_char = @a$

For j = 0 To Len(a$) - 1
   Debug *zz\s[j] + " = " + *zz\c[j]
Next

Debug "-------------"
Debug "Paare aulesen"

Structure t2_CHAR 
      s.s {2}[0] 
EndStructure 

a$ = "Hallo, dies ist ein Test" 

*z2.t2_char = @a$

For j = 0 To (Len(a$) - 1) / 2
   Debug *z2\s[j] 
Next