Mid$ Anweisung / Suchfunktion im Board

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag von mk-soft »

Die Zeichen einzeln einzulesen ist nicht sinnvoll.

Wenn es sich um eine Antwort auf ein Anfrage handelt ist es besser die Empfangsdaten auf Verzugzeit oder auf Endezeichen zu prüfen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag von STARGÅTE »

Gut, also wäre diese MID$ anweisung so eine Funktion in PB:

Code: Alles auswählen

Procedure Overwrite(*String, Start.i, *NewString, Length.i=#PB_Default)
	If Length = #PB_Default
		CopyMemory(*NewString, *String+SizeOf(Character)*(Start-1), SizeOf(Character)*MemoryStringLength(*NewString))
	Else
		CopyMemory(*NewString, *String+SizeOf(Character)*(Start-1), SizeOf(Character)*Length)
	EndIf
EndProcedure

Define Test.s{100} = "Hallo Welt!"
Overwrite(@Test, 3, @" Ha", 3)
Debug Test
Wobei für die gültigkeit des Buffers selbst gesorgt werden muss.

Wenn es dir nur um das ersetzen von Zeichen geht, dann geht natürlich auch das:

Code: Alles auswählen

CompilerIf Defined(CharacterStringArray, #PB_Structure) = #False
	Structure CharacterStringArray
		StructureUnion
			c.c[0]
			s.s{1}[0]
		EndStructureUnion
	EndStructure
CompilerEndIf

Define Test.s{100} = "hallo welt!"

*String.CharacterStringArray = @Test
*String\c[0] = 'H' ; Mit Ascii-Nummer ; Position beginnt bei 0 !
*String\s[6] = "W" ; Mit Zeichen

Debug Test
was ja auch schon von mk-soft und hjbremer vorgeschlagen wurde.

Also ist die Frage jetzt beantwortet?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag von BSP »

Bis auf die Lösung von BSP sind alle Lösungen sehr schnell
Dafür ist meine Version aber die Einzige, die der Mid$- Funktion am nahesten kommt. Grins.
(Und mit ca. 2 Sek für 1 Million durchläufe kann ich leben).

Die Version von mk-soft funktioniert nur, wenn der Ersatzstring gleich lang ist wie der zu ersetzende, je länger der Ersatzstring um so mehr wird vom Original abgeschnitten (verschluckt),

bei CSHW89 & hjbremer werden nur einzelne Zeichen ersetzt.
Die von hjbremer ist ca. 1/3 schneller als die von CSHW89.

@ ts-soft.
ReplaceString ersetzt ALLE Entsprechungen in einem Satz.

Gruß :BSP
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag von Daffy0815 »

@MK-Soft

Ja, das ist ja genau das Problem weswegen der ganze Ringpuffer gebraucht wird!

Genau die gleiche Routine befindet sich im Subsystem nur das hier die Identifikation einer kompletten Registeranfrage (z.B. "DI23<CR>" für den Zustand des Digitaleingangs Nummer 23) in der Interruptserviceroutine der Schnittstelle stattfindet.
Hier ist es direkt möglich das Endzeichen "CR" zu identifizieren OHNE es aus dem Empfangspuffer zu entnehmen.

Da PureBasic aber eine solche Möglichkeit nicht bietet (z.B. LastReceivedChar=....) ist es ja notwendig den Emfpangspuffer quasi doppelt zu puffern.
Will heißen:
Wenn Zeichen empfangen wurde, dann aus Emfangspuffer der Schnittstelle holen, in Ringpuffer eintragen, auf Endzeichen prüfen und falls Endzeichen empfangen die gesamte Registeranfrage aus dem Ringpuffer holen und und interpretieren.

Den gesamten Code mit Prüfsumme und allem anderen "Gedöns" konnte ich hier doch nicht einstellen denn selbst dieser kleine Ausschnitt war doch einigen hier schon zu viel!

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag von Kiffi »

Daffy0815 hat geschrieben:Den gesamten Code mit Prüfsumme und allem anderen "Gedöns" konnte ich hier doch nicht einstellen denn selbst dieser kleine Ausschnitt war doch einigen hier schon zu viel!
Du verstehst es einfach nicht.
ts-soft hat geschrieben:bin hier raus, regt mich immer auf die Ente.
+1
a²+b²=mc²
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag von Daffy0815 »

@Kiffi

zu 1.) Scheint wohl so zu sein...

zu 2.) Das sei Ihnen unbenommen...

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 »

@Daffy0815

Entschuldige bitte, falls ich Dir Dein Thema gestört habe.
Mal geht es um eine Mid$- Anweisung (Funktion?),
dann werden aber nur einzelne Zeichen geändert, dann wieder ist der Serialport im Fokus.

Ich hatte das Thema als Anlass genommen, meine Kenntnisse zu überprüfen und zu erweitern.
Hätte ich gleich am Thema erkannt, worum es Dir geht,
hätte ich mich raus gehalten, da ich zum Serialport nichts betragen kann.

In diesem Sinne:
Gruß: BSP
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag von Daffy0815 »

@BSP

Nee, es ging (und geht) schon um die MID$-Anweisung.
Das mit dem Serialport hat nur dazu geführt das die Sache auffällig wurde.
Und das mit den Kenntnissen zu erweitern / überprüfen ist doch absolut legitim.
Dafür ist doch so ein Forum da (sehe ich jedenfalls so).

Aber mal so eine Frage am Rande die mit der Sache zu tun hat:

Wird bei PureBasic bei einer Funktion ohne Rückgabewert (z. B. Procedure MidString(String.s, ErsatzString.s, StartPos.i)) für String.s der String selbst als Kopie an die Prozedur übergeben (Was ja zu zeitaufwändigen Kopieraktionen führt) oder nur die Adresse von String.s ?


Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
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 »

Daffy0815 hat geschrieben:Wird bei PureBasic bei einer Funktion ohne Rückgabewert (z. B. Procedure MidString(String.s, ErsatzString.s, StartPos.i)) für String.s der String selbst als Kopie an die Prozedur übergeben (Was ja zu zeitaufwändigen Kopieraktionen führt) oder nur die Adresse von String.s ?
Strings werden bei PB immer kopiert und übergeben. Falls du nur die Referenz übergeben willst, musst du das explizit mit Pointern machen.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Mid$ Anweisung / Suchfunktion im Board

Beitrag von 7x7 »

Selbstverständlich ist ReplaceString() vollwertiger Ersatz für Mid$() aus z.B.PowerBasic. Man muss ReplaceString() nur im Modus=#PB_String_InPlace benutzen.
Und damit ist sie auch schneller als alle anderen hierfür vorgeschlagenen Ersatzlösungen.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Gesperrt