Seite 1 von 1

FindAny - Suchen eines Zeichens von mehreren Möglichen

Verfasst: 19.05.2012 09:03
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.

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

Verfasst: 19.05.2012 09:32
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

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

Verfasst: 19.05.2012 11:20
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.