PokeString/PeekString

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Goodjee

Betreff: PokeString/PeekString

BeitragSa, Aug 26, 2006 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
ich habe mir heute mal die Mühe gemacht, eine Bankfunktion für Strings zu schreiben, ist zwar nichts besonderes aber vllt braucht es ja mal einer.

geupdatet:

Code: [AUSKLAPPEN]

bank=CreateBank(12)
pokestring(bank,0,"Hallo")
PokeInt(bank,0,12345)
pokestring(bank,0,"Hallöle")
pokestring(bank,4,"ich kann Strings in banks speichern")
pokestring(bank,8,"und du jetzt auch.")
Print peekstring(bank,0)
Print peekstring(bank,4)
Print peekstring(bank,8)


Function PokeString(bank,pos,inp$)
   If PeekInt(bank,pos)<>0 Then FreeBank PeekInt(bank,pos)
   Local bank2=CreateBank()
   Local i
   PokeInt(bank,pos,bank2)
   ResizeBank(bank2,Len(inp))
   DebugLog Len(inp)
   For i=1 To Len(inp)
     DebugLog i
      PokeByte(bank2,i-1,Asc(Mid(inp,i,1)))
   Next
End Function

Function PeekString$(bank,pos)
   Local output$
   Local i
   bank=PeekInt(bank,pos)
   For i=0 To BankSize(bank)-1
      DebugLog i
      output=output+Chr(PeekByte(bank,i))
   Next
   Return output   
End Function
   


mfg Goodjee
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
  • Zuletzt bearbeitet von Goodjee am Sa, Aug 26, 2006 12:59, insgesamt einmal bearbeitet

D2006

Administrator

BeitragSa, Aug 26, 2006 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Das System finde ich irgendwie komisch. Du machst eine neue Bank, wo der String genau reinpasst. Den "Zeiger" zu dieser Bank schreibst du in die vorhandene. Problem dabei ist, dass die neue Bank nie gelöscht wird. Wann auch. Wenn du die beim auslesen löschen würdest, könntest du nur einmal löschen.

Also ich weiß nicht, wenn ich einen String in einer Bank speicher (zum Beispiel wenn ich im Netzwerk arbeite), dann schreib ich an die erste Stelle als INT die Länge des String und an die folgenden Bytestellen jedes einzelne Zeichen. Dadurch muss man zwar genau die Länge des Strings kennen, wenn man danach noch Daten in die Bank pressen will, aber das ist bei Banks ja allgemein so.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

Goodjee

BeitragSa, Aug 26, 2006 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, mit dem löschen hast du recht...da hab ich jetzt garnicht drüber nachgedacht.

der vorteil hierbei ist jedoch, wie ich finde, das man zur laufzeit ohne größere probleme viele strings auslesen kann, ohne deren exakte länge zu kennen und ohne alle durchgehen zu müssen. man kann die bank ja einfach manuell löschen Wink

edit:wenn beim schreiben schon was vorhanden ist, was eine bank seien könnte wird es vorsorglich gelöscht
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

DerSatan

Gast

BeitragDi, Dez 04, 2007 22:20
Antworten mit Zitat
Erstmal möchte ich mich dafür entschuldigen, das ich diesen (mittlerweile schon etwas älteren Thread ausgegraben habe), falls es jemanden stört.

Ich habe mir eben (unabhängig zu Goodjee) Funktionen geschrieben, die genau diesen Zweck erfüllen... Ich poste mal den Code (Sonst müsste es nicht ins Codearchv -.-^^).

Code: [AUSKLAPPEN]
Graphics 800,600,16,2
b=CreateBank(100)
t$=Input("> ")
Print "Länge des Textes: "+Len(t)
Print "Schreiben..."
Print "Zur Offsetvariable für die Bank hinzuaddieren (Zurückgegebener Wert von 'PokeString'): "+PokeString(b,0,t,1);hier könnt ihr mal die '1' zur '0' machen und sehen was passiert :)
Print "Länge von '"+t+"' (von der Funktion 'BankStringLen' zurückgegeben): "+BankStringLen(b,0)
Print "Lesen..."
Print PeekString(b,0)
WaitKey()
End;So viel zum Beispiel, ich denke es sollte klar sein was das macht.

Function PokeString(bank,offset,txt$,returnlen=0)
   Local ln=Len(txt),offset2=offset;offset2 um nachher den Wert zu errechnen, den man zur Offsetvariable addieren sollte (sehe oben, da stehts auch)
   PokeByte bank,offset2,ln
   offset2=offset2+1
   For c=1 To ln
      PokeByte bank,offset2,Asc(Mid(txt,c,1))
      offset2=offset2+1
   Next
   If returnlen;Wenn man die Länge zurückgegeben haben will
      Return offset2-offset
   EndIf
End Function
Function BankStringLen(bank,offset)
   Return PeekByte(bank,offset)
End Function
Function PeekString$(bank,offset);Zum Lesen, funktioniert eigentlich genauso wie die anderen Befehle
   Local offset2=offset;,ret$
   ln=PeekByte(bank,offset2)
   offset2=offset2+1
   ret$=""
   For c=1 To ln
      ret=ret+Chr(PeekByte(bank,offset2))
      offset2=offset2+1
   Next
   Return ret
End Function


Die Funktion "BankStringLen" habe ich gemacht, damit man auch nachträglich die Länge auslesen kann, wenn man den Text schon verändert hat zum Beispel. Oder man nutzt einfach den 4ten Parameter der Funktion PokeString und subtrahiert 1 (natürlich nur wenn man den zurückgegebenen Wert in einer variable gespeichert hat).^^

So btw mein Computer hat für 10000 ausführungen der beiden Funktionen(PokeString und PeekString) 254 Millisekunden gebraucht (ich hatte nebenbei noch Skype und ähnliches laufen), was etwa 0,0254 Millisekunden für zweimal ausführen ausmacht (das "etwa" weil es ja abweichungen geben kann, da vll ein Programm im Hintergrund eine Aktion ausführt, was die Auslastung erhöhen kann).

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group