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.