Mid$ Anweisung / Suchfunktion im Board

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Christian+
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

Beitrag 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+
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag 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.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag 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
PB 5.31 (x86) & (x64) Win10
Christian+
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

Beitrag 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
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag 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
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
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

Beitrag 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.
Benutzeravatar
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

Beitrag von NicTheQuick »

Na gut. Ich erkläre damit dieses Thema als geschlossen. Bevor hier noch weitere Anfeindungen entstehen. Das muss ja nicht sein.
Gesperrt