Seite 5 von 5

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 23.02.2012 18:57
von Daffy0815
@7x7

Sorry, das verstehe ich nicht!

Die Syntax lautet doch "String$ = ReplaceString(String$, SuchString$, ErsatzString$ [, Modus [, StartPosition]])"

Was geben Sie denn hier für "SuchString$" an wenn Sie gar keinen String suchen?

Gruß

Daffy

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 23.02.2012 19:38
von Christian+
Also ReplaceString ist nur für suchen geeignet und sollte durch das suchen auch langsamer sein.
Ist in deinem Fall also wenig nützlich.

Ich würde mir an deiner Stelle einfach die Befehle selber schreiben die du brauchst.

Code: Alles auswählen

EnableExplicit

Macro SetChar(_str_, _idx_, _char_)
  PokeC(@_str_ + SizeOf(Character) * (_idx_ - 1), _char_)
EndMacro

Macro GetChar(_str_, _idx_)
  PeekC(@_str_ + SizeOf(Character) * (_idx_ - 1))
EndMacro

Macro GetMid(_str_, _start_, _len_)
  PeekS(@_str_ + SizeOf(Character) * (_start_ - 1), _len_)
EndMacro

Macro SetMid(_str_, _replacestr_, _start_, _len_)
  CopyMemory(@_replacestr_, @_str_ + SizeOf(Character) * (_start_ - 1), SizeOf(Character) * _len_)
EndMacro

Define text.s = "Hallo Welt!"
Debug text

SetChar(text, 7, 'Z')
Debug text

Debug Chr(GetChar(text, 5))

Debug GetMid(text, 7, 4)

SetMid(text, "Haus", 7, 4)
Debug text
Sind jetzt eigentlich alle Fragen geklärt? Ich helfe gerne aber irgendwie habe ich hier den Überblick verloren. Deine Beispielcodes laufen ja wenn du wie schon mal hier geschrieben wurde beachtest dass beim Zugriff mit Pointern den Index immer eins kleiner nehmen musst wenn du nicht Funktion wie die von mir hier nimmst die wie die PureBasic String Funktionen bei 1 beginnen. Eine Mid Funktion zum Ersetzen gibt es halt nicht das sollte ja inzwischen klar sein muss man sich bei Bedarf halt kurz schrieben wenn man eine schnelle Lösung braucht aber dafür gab es ja jetzt auch schon viele Lösungsvorschläge.

Gruß Christian+

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 23.02.2012 19:47
von Daffy0815
@Christian+

Ja, alle Fragen zu dem Thema sind geklärt!
Das Problem war, wie Sie richtig erkannt haben, das ich bedingt durch den Positionsanfang "1" bei der MID-Funktion davon ausging, dass dies bei dem Zeichenzugriff auf den String auch so ist. Dies führte dann logischerweise bei jedem Übertritt der Pufferzeiger zur Nichteintragung des Zeichens in den Pufferstring.

Gruß

Daffy

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 23.02.2012 20:17
von Nino
Daffy0815 hat geschrieben:@Nino
Ich habe den Code so aus dem Programm extrahiert wie er im eigentlichen Programm verwendet wird und dabei der Fehler auftritt.
Das verrückte daran ist doch gerade die Tatsache, dass das Problem bei den "einfachen" Beispielen die hier von CSHW und hjbremer gezeigt wurden nicht auftreten. Meine erste Vermutung war daher, dass die Zeichen via serielle Schnittstelle "verloren" gehen. Dem ist aber nicht so!
Daher finde ich die Äußerung "gedöns mit der seriellen Schnittstelle" schlicht kontraproduktiv.
"Kontraproduktiv" sind hier ganz andere Dinge. Kiffi hat versucht Dir das zu erklären (danke dafür), aber du hast deutlich gezeigt dass du es nicht verstehst.
Daffy0815 hat geschrieben:Auch das mit den "90%" (woher haben Sie diese Information eigentlich?) bringt niemanden weiter.
Ich habe nicht "90%" geschrieben. Liest du eigentlich die Postings, bevor du auf sie "antwortest"?
Aber das was ich da mit den Prozenten geschrieben habe erklärt duchaus einiges für diejenigen, die in der Lage sind einfache Zusammenhänge zu verstehen. Du solltest nicht von dir auf andere schließen.

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 23.02.2012 20:27
von Daffy0815
@Nino

Um den Thread nicht noch weiter mit am Thema vorbeigehendem zu verlängern erspare ich mir und den anderen Lesern hier eine Antwort darauf.

Gruß

Daffy

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 24.02.2012 01:15
von BSP
Hallo.
Ich habe noch ein wenig weiter herum experimentiert
und erlaube mir nun, noch ein paar meiner Ergebnisse zu präsentieren.

Zunächst:
Wenn ich das richtig verstanden habe, soll der Mid$- Befehl so arbeiten:
Ersetze in einem String
einen Teilstring variabler Länge
durch einen Ersatzstring variabler Länge.
Teilstring und Ersatzstring müssen nicht gleich lang sein.

Eure Versionen funktionieren dann sehr schnell und gut,
wenn der Teil- und der Ersatzstring gleich lang sind.

ReplaceString ist dann gut, wenn die Bedingungen nur einmal erfüllt sind.
Beispiel:

Code: Alles auswählen

a$="Das ist so, das war so, das wird immer so bleiben!"
Debug a$
alt$="so"
neu$="das"
Debug ReplaceString(a$,alt$,neu$,0,10)
Hier nun noch meine Varianten für diejenigen,
die Lust haben, noch weiter zu experimentieren.

Code: Alles auswählen

Procedure.s ErsetzeString1(String$,pos,laenge,ersatz$)
  ProcedureReturn Left(String$,pos-1)+ersatz$+Mid(String$,pos+laenge)
EndProcedure

Macro ErsetzeString2(String,pos,laenge,ersatz)
  Left(String,pos-1)+ersatz+Mid(String,pos+laenge)
EndMacro

Macro ErsetzeString3(String , pos , laenge , Ersatz)
  len_original = Len(PeekS(@String)) * SizeOf(Character)
  l1 = pos+laenge-1
  len_rest     = len_original - l1
  b$=PeekS(@String,pos-1) + Ersatz + PeekS(@String+l1, len_rest)
EndMacro

; --------------------

; Der Originalsatz
a$="Das war einmal der Satz"
Debug a$
Debug ""
; Das hier, weil ich zu faul zum selber Zaehlen bin
; und weil Änderungen ja später vom Prg. generiert werden könnten
lmax = Len(a$)
alt$ = "war einmal"
neu$ = "ist nun"
pos = FindString(a$,alt$)
laenge = Len(alt$)

; Ein Füllzeichen, wenn der Str. seine Länge behalten soll.
fuell$="."

; Nun der neue Satz 1
zeit=ElapsedMilliseconds()
For i=1 To 1000000
  b$=ErsetzeString1(a$,pos,laenge,neu$)
Next
Debug "Zeit 1 = "+Str(ElapsedMilliseconds()-zeit)+" MilliSek."
Debug b$
Debug LSet(b$ ,lmax,fuell$)
Debug RSet(b$ ,lmax,fuell$)
Debug ""

; Nun der neue Satz 2
; Meine schnellste und übersichtlichste Lösung
zeit=ElapsedMilliseconds()
For i=1 To 1000000
  b$=ErsetzeString2(a$,pos,laenge,neu$)
Next
Debug "Zeit 2 = "+Str(ElapsedMilliseconds()-zeit)+" MilliSek."
Debug b$
Debug LSet(b$ ,lmax,fuell$)
Debug RSet(b$ ,lmax,fuell$)
Debug ""

; Nun der neue Satz 2
zeit=ElapsedMilliseconds()
For i=1 To 1000000
ErsetzeString3(a$,pos,laenge,neu$)
Next
Debug "Zeit 3 = "+Str(ElapsedMilliseconds()-zeit)+" MilliSek."
Debug b$
Debug LSet(b$ ,lmax,fuell$)
Debug RSet(b$ ,lmax,fuell$)
Debug ""

; Nun der neue Satz 4
zeit=ElapsedMilliseconds()
For i=1 To 1000000
b$=ReplaceString(a$,alt$,neu$)
Next
Debug "Zeit 4 = "+Str(ElapsedMilliseconds()-zeit)+" MilliSek."
Debug b$
Debug LSet(b$ ,lmax,fuell$)
Debug RSet(b$ ,lmax,fuell$)
Gruß: BSP

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 24.02.2012 08:36
von Christian+
So ich habe mir mal deine Lösungen angeschaut und eine noch etwas schnellere erstellt.
Ist im Wesentlichen eine optimierte Version deines ErsetzeString3.

Code: Alles auswählen

Macro ErsetzeString5(string, pos, laenge, ersatz)
  PeekS(@string, pos - 1) + ersatz + PeekS(@string + SizeOf(Character) * (pos + laenge - 1))
EndMacro

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 24.02.2012 11:00
von BSP
Hallo Christian+
Groll, über mich selber.
Und wieder einmal haben meine blödsinnigen rechnereien die schnellste Lösung verhindert.
So wie Du das nun gemacht hast, sollte das eigentlich aussehen.
Ich habe gestern noch so viel mit Peek & Poke & Memory herum gebastelt, das ich in dem Memory auf meinem Hals schon einen Knoten hatte.
Mit Deiner Lösung läuft das sogar schneller als mit dem PB- Befehl ReplaceString.
Und darum vermute ich mal, das ein eigenständiger Mid$- Befehl nicht unbedingt notwendig ist.
Der würde vermutlich auch nicht schneller laufen.
Denn streng genommen müssten da ja auch noch sicherheitsabfragen mit rein wie:
If Pos > 0 and Pos <= len(String)
(ebenso für die Länge)
Und dadurch würde ein eigenständiger Befehl ja auch wieder ausgebremst werden.
Also wie meistens bei solchen Hochsprachen:
Wers schneller braucht, muss selber basteln.

Gruß: BSP

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 24.02.2012 18:30
von HeX0R
Daffy0815 hat geschrieben:@Nino

Um den Thread nicht noch weiter mit am Thema vorbeigehendem zu verlängern erspare ich mir und den anderen Lesern hier eine Antwort darauf.

Gruß

Daffy
So so, du schreibst also extra eine Antwort, um zu sagen dass du keine Antwort geben möchtest... :freak:

Aber schon Wahnsinn wie lange man einen Thread wegen eines solchen Kinkerlitzchens machen kann.
In der Zeit werden ganze Applikationen programmiert.

Vermutlich war es nur mal wieder an der Zeit das übliche "Dämliches PB, kennt nicht mal den Befehl DingAusAnus(Wurst.s)" abzulassen.

Re: Mid$ Anweisung / Suchfunktion im Board

Verfasst: 24.02.2012 20:37
von NicTheQuick
Na gut. Ich erkläre damit dieses Thema als geschlossen. Bevor hier noch weitere Anfeindungen entstehen. Das muss ja nicht sein.