[Delphi] Być mo?że kolejny BUG w Delphi :))

0

hmmmmm.... chciałem się poradzić programerów co
sądzicie o czymś co mi się wydaje być jakimś bugiem
w Delphi, chodzi o zwrot funkcji, kiedy pisze
Result := coś to wszystko jest OK ale kiedy zajdzie
potrzeba zapisu w pętli Result := Result + coś to
też niby działa a jednak jakoś dziwnie.

Powiedzmy że mamy przykładowoą funkcję:

function dupa(s: string): string;
begin
Result := Result + s;
end;

i teraz kidy posłużymy się takim kodem:

var
i : integer;
begin
i := 40;
ShowMessage(dupa(Chr(i)));
i := i + 1;
ShowMessage(dupa(Chr(i)));
i := i + 1;
ShowMessage(dupa(Chr(i)));
i := i + 1;
ShowMessage(dupa(Chr(i)));
i := i + 1;
ShowMessage(dupa(Chr(i)));
//i.t.d. . . .
end;

to działa to znaczy wyświetla MessageBoxy
z poszczególnymi znakami, kiedy jednak
napiszemy taki kod:

var
i : integer;
begin
for i := 40 to 50 do ShowMessage(dupa(Chr(i)))
end;

no właśnie, sami zobaczcie, mnie to brzydko pachnie
i wcale nie jestem z tego zadowolony a zwłaszcza
że to mi się wydaje nie logiczne że najpierw wyświetla
jeden znak potem dwa znaki potem trzy i cztery itd...

Może mi to ktoś racjonalnie wytłumaczyć ?

0

Rzeczywiście, jest to mało logiczne. Może wykonywanie poleceń tego typu w pętli (funkcji) powoduje odstawienie ostatniego zwrotu z funcji gdzieś do pamięci (czy stosu). Pewnie jest to związane z samą wewnętrzną strukturą funkcji ShowMessage ? Może użycie zwykłej instrukcji zakończonej ; powoduje skasowanie informacji ze stosu zawierającej wynik funkcji ?
Przyznam, że to tylko przypuszczenia i nie mam pewności czy jest to dobra ścieżka.

Pozdrawiam

0

Powiedzmy że mamy przykładowoą funkcję:

function dupa(s: string): string;
begin
Result := Result + s;
end;

Więc dla mnie sprawa jasna Result nie jest zdefiniowany i dodajasz do wyniku oprócz zmiennej s także pewnien losowy łańcuch jak już coś to możesz zrobić tak:

function dupa(s: string): string;
begin
Result := '';
Result := Result + s;
end;

no ale dla mnie to bez sensu :)

0

function dupa(s: string): string;
begin
Result := Result + s;
end;

A jaką na początku wartość ma Result? Nic dziwnego, że takie błędy masz. Zmienne lokalne nie są inicjowane i przyjmują wartość taką, jaka była ostatnio w tym miejscu co teraz zajmują na stosie. Musisz najpierw zainicjować Result. To nie żaden bug. Tak jest w większości języków.

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