Strings kürzen, gibt es da ne bessere Lösung?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

KirkZero

Betreff: Strings kürzen, gibt es da ne bessere Lösung?

BeitragDi, Jun 29, 2010 4:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo erstmal...

Folgendes Problem:
eine Funktion liefert mir einen String, diesen möchte ich dann Zeichen für Zeiche (links beginnend) auswerten.
Ich weiss, das man das mit einer schleife machen kann.

Ich möchte jedoch gerne, nachdem ich das erste linke Zeichen ausgewertet hab, dieses aus dem String löschen, damit das nächste Zeichen dann an erster Stelle steht.
Ich habe mit Hilfe der Bmax Hilfe nun diese Lösung erarbeitet:

Code: [AUSKLAPPEN]

a$ ="1234567890"

Repeat
   
   Print a$
   b$=Left(a$,1) 'Das erste Zeichen aus a$ in b$ speichern
   a$=Right(a$,a.length-1 )
   Print b$ 'mit b$ irgendwas anstellen und dann das nächste Zeichen holen
   Delay (1000)

If KeyHit(key_escape) Then End
Until a$=""
End


Meine Frage: gibt es da noch ne eigene Funktion für, oder vielleicht eine bessere Lösung?
hab eine menge zu BMax im internet gefunden und kam bis jetzt sehr gut klar, aber als ich dann mit Strings arbeiten wollte, habe ich nicht wirklich viele anhaltspunkte gefunden.
No Brain, No Pain

DaysShadow

BeitragDi, Jun 29, 2010 4:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine wirklich kürzere Variante, aber ohne die Nutzung des BRL.Retro Moduls, wobei die Zeilen doch auch kürzer sind Wink

BlitzMax: [AUSKLAPPEN]
a$ ="1234567890" 

Repeat

Print a$
b$= Chr( a[ 0 ] ) 'Das erste Zeichen aus a$ in b$ speichern, strings sind auch nur ein Array
a$= a[ 1.. ] ' a besteht nur noch aus den Zeichen 1 bis Ende des Arrays
Print b$ 'mit b$ irgendwas anstellen und dann das nächste Zeichen holen
Delay (1000)

If KeyHit(key_escape) Then End
Until a$=""
End
Blessed is the mind too small for doubt
 

KirkZero

BeitragDi, Jun 29, 2010 5:06
Antworten mit Zitat
Benutzer-Profile anzeigen
DaysShadow hat Folgendes geschrieben:
Keine wirklich kürzere Variante, aber ohne die Nutzung des BRL.Retro Moduls, wobei die Zeilen doch auch kürzer sind Wink


Dann gehe ich mal davon aus, das man das BRL.Retro Modul besser meiden sollte?!

Dann weiss ich ja in zukunft bescheid, das ich für Strings auch die Funktionen für Arrays verwenden kann

Danke für Deinen Lösungsansatz und kürzere Zeilen sind immer gut Wink
No Brain, No Pain
 

FWeinb

ehemals "ich"

BeitragDi, Jun 29, 2010 11:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Den Funktionsaufruf von Chr kann man sich auch Sparen, indem man a [ 0..1 ] schreibt. Habe jetzt nicht getestet ob das "schneller" ist. Also frei nach dem Motto: "Wenn schon, denn schon".

MfG
ich
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Firstdeathmaker

BeitragDi, Jun 29, 2010 13:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleiner Speedtest:

Code: [AUSKLAPPEN]
SuperStrict

Local doTest:Int[4]
doTest[0] = False
doTest[1] = True
doTest[2] = True
doTest[3] = True

Local a:String
Global t:Double
SeedRnd(MilliSecs())

Print "creating string"
For Local i:Int = 0 Until 100
   a:+Chr(Rand(255))
Next
For Local i:Int = 0 Until 12 'warning, exponential grows
   a:+a + a
Next

Print "string length: " + a.length

If doTest[0]
   '##### Test A #####
   Print "checking string Method A"
   t = MilliSecs()
   For Local i:Int = 0 Until a.Length
      Local b:String = Left(a, 1)
      a = Right(a, a.Length - 1)
      'Print b
   Next
   t = MilliSecs() - t
   Print "duration A: " + t
EndIf

If doTest[1]
   '##### Test A2 #####
   Print "checking string Method A2"
   t = MilliSecs()
   For Local i:Int = 0 Until a.Length
      Local b:String = Mid(a, i, 1)
      'Print b
   Next
   t = MilliSecs() - t
   Print "duration A2: " + t
EndIf

If doTest[2]
   '##### Test B #####
   Print "checking string Merthod B"
   t = MilliSecs()
   For Local i:Int = 0 Until a.Length
      Local b:String = Chr(a[i])
      'Print b
   Next
   t = MilliSecs() - t
   Print "duration B: " + t
EndIf

If doTest[3]
   '##### Test C #####
   Print "checking string Merthod C"
   t = MilliSecs()
   For Local i:Int = 0 Until a.Length
      Local b:String = (a[i..i + 1])
      'Print b
   Next
   t = MilliSecs() - t
   Print "duration C: " + t
EndIf

End



Ergebnis auf meinem Laptop, Core I7 Mobile ohne Debug:

Zitat:
creating string

string length: 53144100

checking string Method A2

duration A2: 6106.0000000000000

checking string Merthod B

duration B: 5046.0000000000000

checking string Merthod C

duration C: 5387.0000000000000



Schluss:
Code: [AUSKLAPPEN]
   For Local i:Int = 0 Until a.Length
      Local b:String = Chr(a[i])
      'Print b
   Next


ist die schnelleste Möglichkeit, einzelne Zeichen zu überprüfen.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image
 

KirkZero

BeitragDo, Jul 01, 2010 6:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochma ich...

entweder bin ich blöd oder es liegt an der Uhrzeit (Urlaub macht mich immer Nacktaktiv Wink )
ich hätte das ganze jetzt gerne andersherum
also... das letzte Zeichen vom String in b speichern, auswerten und dann aus a Löschen...

aber irgendwie bekomme ich immer nen fehler anscheinend ist das array dann zu lang...

hier der Code
Code: [AUSKLAPPEN]

a$ ="1234567890"

Repeat
   
   Print a$
   b$= Chr( a[ a.length ] ) 'Das letzte Zeichen aus a$ in b$ speichern, (strings sind auch nur ein Array)
   a$= a[ 0..a.length-1 ]
   Print b$ 'mit b$ irgendwas anstellen und dann das nächste Zeichen holen
   Delay (1000)

If KeyHit(key_escape) Then End
Until a$=""
End



schon irgendwie krank...
LevelEditor, TileMap kollision usw hab ich geschafft und dann scheiter ich an der Auswertung von Strings Sad

und noch immer ist die folgende Frage offen

DaysShadow hat Folgendes geschrieben:
Zitat:
Keine wirklich kürzere Variante, aber ohne die Nutzung des BRL.Retro Moduls, wobei die Zeilen doch auch kürzer sind Wink


sollte man das BRL.Retro modul besser meiden?
  • Zuletzt bearbeitet von KirkZero am Do, Jul 01, 2010 6:59, insgesamt einmal bearbeitet

DaysShadow

BeitragDo, Jul 01, 2010 6:59
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
a$ ="1234567890" 

Repeat

Print a$
b$= Chr( a[ a.length - 1 ] ) 'Das letzte Zeichen aus a$ in b$ speichern, (strings sind auch nur ein Array)
a$= a[ 0..a.length - 1 ]
Print b$ 'mit b$ irgendwas anstellen und dann das nächste Zeichen holen
Delay (1000)

If KeyHit(key_escape) Then End
Until a$=""
End


Ist klar, dass du einen Fehler bekommst, da du, wenn du mit a.length auf das array zugreifst, immer eine Position hinter dem letzten Eintrag abfragst Razz
Wenn a.length = 5, dann array = 0 bis 4, also 5 Einträge, a.length - 1 = 4, klar soweit oder?
Dementsprechend muss natürlich in der Kürzungszeile a.length - 2 stehen, damit du das letzte Zeichen rauslässt, Einträge 0 bis 3 halt, 4 fliegt raus.

Und BRL.Retro ist halt nur wegen der Basic-Kompatibilität da und soviel ist von Basic bei BlitzMax nicht mehr übrig und es gibt ja BlitzMax-Möglichkeiten das ganze zu lösen.
Nutzen kannst du es an sich natürlich immer noch, das macht keinen Ärger oder so. Wink

MfG DaysShadow
Blessed is the mind too small for doubt
  • Zuletzt bearbeitet von DaysShadow am Do, Jul 01, 2010 7:07, insgesamt einmal bearbeitet
 

KirkZero

BeitragDo, Jul 01, 2010 7:04
Antworten mit Zitat
Benutzer-Profile anzeigen
hmmm... wenn ich deinen Code jetzt aber ausführe (-1 und -2 hatte ich auch versucht wegen des Array Index Fehlers),
dann wird aber jedes zweite zeichen übersprungen...

Ausgabe wäre da folgende:

Executing:untitled2.debug.exe
1234567890
0
12345678
8
123456
6
1234
4
12
2

Process complete
No Brain, No Pain

DaysShadow

BeitragDo, Jul 01, 2010 7:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, auch in die Kürzungszeile muss a.length - 1, hatte es nicht getestet, so gehts aber.
Rein von der Logik wäre für mich halt -2 das Richtige gewesen, funktioniert aber wohl nicht nach meiner Logik. Wink
Blessed is the mind too small for doubt
 

KirkZero

BeitragDo, Jul 01, 2010 7:13
Antworten mit Zitat
Benutzer-Profile anzeigen
ohjeh...

Ja, dann klappt es...
ist ein bissel verwirrend, aber wenn man drüber nachdenkt ist es logisch...
Einfach nur beachten, das es in einem Array immer bei 0 losgeht, legth aber immer den wirklichen Wert liefert...

Ich danke Dir!
No Brain, No Pain

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group