FindAny - Suchen eines Zeichens von mehreren Möglichen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
TKRoth
Beiträge: 32
Registriert: 24.02.2012 15:34
Wohnort: Hamburg
Kontaktdaten:

FindAny - Suchen eines Zeichens von mehreren Möglichen

Beitrag von TKRoth »

Ich möchte hier auch einmal ein Schnipsel vorstellen. Vielleicht könnt ihr es noch optimieren:

Code: Alles auswählen

EnableExplicit

Procedure.i FindAny(QStr.s,FStr.s,Start=1)
  Protected Pos
  If QStr
    For Pos=Start To Len(QStr)
      If FindString(FStr,Mid(QStr,Pos,1)):ProcedureReturn Pos:EndIf
    Next
  EndIf:ProcedureReturn 0
EndProcedure

Debug FindAny("10 PRINT WERT:GOSUB 1000",":(.+-*/")
Debug FindAny("10 PRINT WERT+5:GOSUB 1000",":(.+-*/")
Hier wird der String 'QStr' auf eines der Zeichen in 'FStr' durchsucht. Das erste Auffinden wird zurückgegeben. Findet die Routine Nichts, gibt es 0 zurück.
Computer werden benötigt um Probleme zu lösen die man ohne Computer nicht hätte.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: FindAny - Suchen eines Zeichens von mehreren Möglichen

Beitrag von Nino »

TKRoth hat geschrieben:Vielleicht könnt ihr es noch optimieren
If QStr ist nicht nötig, denn wenn QStr="" ist, dann ist Len(QStr) = 0, und die Schleife wird ohnehin nie durchlaufen (Start >= 1 vorausgesetzt. Vielleicht sollte man dies sowieso sicherheitshalber besser prüfen, ich weiß nicht was Mid() zurückliefert, wenn Pos < 1 ist). Und Len(QStr) besser nur 1x aufrufen, weil es sonst unnötige Zeit kostet.

Code: Alles auswählen

EnableExplicit

Procedure.i FindAny(QStr.s, FStr.s, Start=1)
   Protected Pos, Length = Len(QStr)
   
   For Pos = Start To Length
      If FindString(FStr, Mid(QStr, Pos, 1))
         ProcedureReturn Pos
      EndIf
   Next
   
   ProcedureReturn 0
EndProcedure


Debug FindAny("10 PRINT WERT:GOSUB 1000", ":(.+-*/")
Debug FindAny("10 PRINT WERT+5:GOSUB 1000", ":(.+-*/")
Duch Verwendung von Pointern lässt sich der Code wahrscheinlich noch beschleunigen.

Grüße, Nino
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FindAny - Suchen eines Zeichens von mehreren Möglichen

Beitrag von STARGÅTE »

Das würde dann so aussehen:

Code: Alles auswählen

Structure CharacterArray
	StructureUnion
		c.c[0]
	EndStructureUnion
EndStructure

Procedure FindAny(QStr.s, FStr.s, Start=1)
	Protected *QStr.CharacterArray = @QStr
	Protected *FStr.CharacterArray = @FStr
	Protected Q.i, LastQ.i = MemoryStringLength(*QStr)-1
	Protected F.i, LastF.i = MemoryStringLength(*FStr)-1
	For Q = Start-1 To LastQ
		For F = 0 To LastF
			If *FStr\c[F] = *QStr\c[Q]
				ProcedureReturn Q+1
			EndIf
		Next
	Next
EndProcedure

Debug FindAny("Das ist, wie immer, ein Beispiel.", ".,")
Edit: Hatte den Start vergessen.
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
Antworten