Mid$ Anweisung / Suchfunktion im Board
Re: Mid$ Anweisung / Suchfunktion im Board
@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
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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
-
- Beiträge: 213
- Registriert: 13.07.2008 10:05
- Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660
Re: Mid$ Anweisung / Suchfunktion im Board
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.
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+
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
Gruß Christian+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Re: Mid$ Anweisung / Suchfunktion im Board
@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
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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
Re: Mid$ Anweisung / Suchfunktion im Board
"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:@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.
Ich habe nicht "90%" geschrieben. Liest du eigentlich die Postings, bevor du auf sie "antwortest"?Daffy0815 hat geschrieben:Auch das mit den "90%" (woher haben Sie diese Information eigentlich?) bringt niemanden weiter.
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
@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
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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
Re: Mid$ Anweisung / Suchfunktion im Board
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:
Hier nun noch meine Varianten für diejenigen,
die Lust haben, noch weiter zu experimentieren.
Gruß: BSP
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)
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$)
PB 5.31 (x86) & (x64) Win10
-
- Beiträge: 213
- Registriert: 13.07.2008 10:05
- Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660
Re: Mid$ Anweisung / Suchfunktion im Board
So ich habe mir mal deine Lösungen angeschaut und eine noch etwas schnellere erstellt.
Ist im Wesentlichen eine optimierte Version deines ErsetzeString3.
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
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Re: Mid$ Anweisung / Suchfunktion im Board
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
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
PB 5.31 (x86) & (x64) Win10
- HeX0R
- Beiträge: 3040
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: Mid$ Anweisung / Suchfunktion im Board
So so, du schreibst also extra eine Antwort, um zu sagen dass du keine Antwort geben möchtest...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

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.
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Mid$ Anweisung / Suchfunktion im Board
Na gut. Ich erkläre damit dieses Thema als geschlossen. Bevor hier noch weitere Anfeindungen entstehen. Das muss ja nicht sein.