Seite 4 von 5
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 13:22
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.
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 13:27
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?
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 13:33
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
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 14:01
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
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 14:03
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
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 14:11
von Daffy0815
@Kiffi
zu 1.) Scheint wohl so zu sein...
zu 2.) Das sei Ihnen unbenommen...
Gruß
Daffy
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 14:59
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
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 15:56
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
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 16:34
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.
Re: Mid$ Anweisung / Suchfunktion im Board
Verfasst: 23.02.2012 17:23
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.