Hallo Himitsu,
bin mir gerade nicht sicher ob wir von der selben Codestelle reden.
NextStep war ja in der Hauptschleife.
Kann man natürlich ohne Goto machen, aber so wie es da steht, würde ich sagen stimmt es und da hilft auch kein Continue. Aber ich verwende Continue eigentlich nie. Continue setzt doch die aktuelle Schleife fort ohne den Rest der Schleife zu durchlaufen, oder? Wäre in dem Fall also die innere Schleife, was falsch wäre. An den Anfang der äußeren Schleife zu springen wäre auch falsch weil dann die Schleifenbedingung nicht abgefragt würde.
Ist aber alles Makulatur, weil ich ja auch das letzte Goto entfernt habe.
Alte Version:
Delphi-Quellcode:
while (Offset <= iTLen) and (OffSet >= 0) do
begin
j := 0; // Anzahl der Übereinstimmungen
while j < iPLen do
begin
if Text[Offset - j * iDir] = Pattern[iOffKorr - j * iDir] then
inc(j)
else
begin
iBadSkip := FBadTable[Ord(Text[Offset - j * iDir])] + iPLen - j;
if iBadSkip > FGoodTable[j] then
begin
inc(Offset, iBadSkip * iDir); // Bad-Table verwenden
end
else
begin
inc(Offset, FGoodTable[j] * iDir); // Good-Table verwenden
end;
Goto NextStep;
end;
end;
Exit(Offset - iOffKorr + 1);
NextStep:
end;
Aktuelle Version:
Delphi-Quellcode:
while (Offset <= iTLen)
and (OffSet >= 0)
do
begin
pcPattern := @Pattern[iOffKorr];
pcText := @Text[Offset];
j := 0;
// Anzahl der Übereinstimmungen
while (j < iPLen)
and (pcText^ = pcPattern^)
do
begin
dec(pcPattern, iDir);
dec(pcText, iDir);
inc(j)
end;
if j < iPLen
then
begin
iBadSkip := FBadTable[Ord(pcText^)] + iPLen - j;
if iBadSkip > FGoodTable[j]
then
begin
inc(Offset, iBadSkip * iDir);
end
else
begin
inc(Offset, FGoodTable[j] * iDir);
end;
end
else
Exit(Offset - iOffKorr + 1);
end;