Dziwne zachowanie funkcji w Delphi

0

Cześć, mam funkcję:

function UsunZnaki(b: String): String;
begin
Delete(b,Pos('-',b),1);
Delete(b,Pos(':',b),1);
if Pos('-',b) > 0 then UsunZnaki(b);
if Pos(':',b) > 0 then UsunZnaki(b);
Result := b;
end;

funkcja dostaje zmienną w której występuje '-' i ':' i w trakcje działania krok po kroku funkcja działa prawidłowo, usuwa mi zbędne znaki. W chwili kiedy usunie już wszystkie zbędne znaki przechodzi do linii Result := b; i tak mi się wydaje że powinna zakończyć się funkcja i wartość zmiennej b powinna wrócić do miejsca wywołania funkcji. Tak nie jest, funkcja zaczyna odtwarzać wcześniejszą wartość zmiennej b tzn, wstawia do zmiennej '-' i ':' i po odtworzeniu zmiennej zwraca ją do miejsca wywołania.
Czemu tak się dzieje ?

Wywołanie funkcji wygląda tak:

a := UsunZnaki(nazwa);
2
if Pos('-',b) > 0 then UsunZnaki(b);
if Pos(':',b) > 0 then UsunZnaki(b);

Rezultat wywołań rekurencyjnych nie trafia do żadnej zmiennej, więc czego się spodziewałeś? Do tego przekazujesz wejściowy łańcuch przez wartość, co po pierwsze jest najwolniejszym sposobem podawania łańcuchów do procedur/funkcji, a po drugie, każde rekursyjne wywołanie dostaje kopię łańcucha i zmiany na nim dokonane są widoczne jedynie lokalnie (w jednej instancji funkcji, poza nią już nie);

Lepszym rozwiązaniem było by po prostu przepisywanie znaków z łańcucha wejściowego do rezultatu:

function RemoveChars(const AString: String): String;
var
  LChar: Char;
begin
  Result := '';

  for LChar in AString do
    if not (LChar in [':', '-']) then
      Result += LChar;
end;

lub tak:

function RemoveChars(const AString: String; const ACharsToRemove: TSysCharSet): String;
var
  LChar: Char;
begin
  Result := '';

  for LChar in AString do
    if not (LChar in ACharsToRemove) then
      Result += LChar;
end;

lub skorzystanie z wbudowanych funkcji do zamiany znaków, np. StringReplace.

0
Result += LChar;

Zrób z plusa dwukropek

0
user322 napisał(a)

Zrób z plusa dwukropek

Nie, to nie będzie to samo - przydałoby się najpierw ten kod zrozumieć, zanim się cokolwiek podpowie; Jak zamieni + na : to rezultatem funkcji zawsze będzie jeden znak; Tak więc aby "naprawić" ten kod, należy skorzystać ze wskazówki @kaczusa (na temat piszemy w postach), czyli wykorzystać schemat X := X + Y;

Korzystam od D7 do XE10.1 więc dementuję plotkę, jakoby był taki operator.

To nie jest żadna plotka - nie zauważyłem, że wątek dotyczy Delphi i podałem kod dla mnie natywny, czyli dla FPC; Poza tym szkoda, że Delphi nadal nie wspiera tego operatora, a tym samym nie umożliwia skracania zapisu tego typu dopisań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1