Konkurs #4

3

Witam ;)

Tym razem należy zmodyfikować ten kod:

Const Tab: Array[0..5] of uint32 = (10, 20, 30, 40, 50, 60);
Var I: uint8;
Begin
 For I := Low(Tab) To High(Tab) Do
 Begin
  // miejsce na kod
 End;
End.

Tak aby wyświetlał w każdej linii kolejne wartości z tablicy Tab (czyli linia pierwsza: 10, druga - 20 itd.).

Zasady:
1.Nie można korzystać ze znaku [ oraz ^.
2.Kod można wstawiać tylko w miejsce oznaczone komentarzem, nie można modyfikować już napisanego.
3.Rozwiązanie powinno działać pod x86-owym FPC 2.6.4.
4.Powinno także działać, gdy zmodyfikuje się dane w tablicy Tab - czyli zrobienie statycznego case odpada.
5.Ewentualne wstawki assemblerowe liczą się tylko w intelowskiej składni.
6.Rozwiązania oczywiście na PW.

Czas: tydzień od dzisiaj (czyli do 1 maja).

Drobna podpowiedź: ja odnalazłem jedno rozwiązanie, lecz jest ono dosyć... specyficzne - sądzę, że mało kto będzie wiedział, jak ono działa (choć jest jednolinijkowe), ale w końcu o to chodzi w konkursach ;)

Powodzenia!

4

Wybaczcie za późne rozwiązanie - rano 1 maja wyjeżdżałem do Zakopanego i zapomniałem dzień przed ogłosić wyniki (zmęczenie :P).

Anyway, rozwiązanie:

Writeln(tab(.I.));

(operator (. jest tym samym, co [ - analogicznie odnośnie drugiego.)
@Azarien, @lukasz1235

Pół-rozwiązanie, które łamie założenie odnośnie FPC jako kompilatora to:

WriteLn(PGuid(Integer(Addr(Tab)) + SizeOf(uint32) * i).D1);

(Delphi nie wymaga operatora dereferencji.)
@szopenfx, @Tajiri (w jego przypadku PExceptionRecord(Cardinal(@tab) + i * 4).ExceptionCode, lecz zasada działania analogiczna.)

Rozwiązaniem #2 mogłoby być skorzystanie z jakiejś x86-owej instrukcji wczytującej uint32 z pamięci do rejestru/na stos* i ręczne wywołanie funkcji z RTLa FPC.

Więc w sumie zwycięzcami zostali @Azarien oraz @lukasz1235 - brawo! ;)


`*` atoli `mov eax, [...]` narusza zasadę #1, a to samo w składni AT&T - #5. Nie jestem pewien, czy taka instrukcja w ogóle istnieje, dlatego też pozostawiam to jako takie rozwiązanie hipotetyczne.
1

Znowu @Patryk27 wyszukał jakieś dziwactwa FPC, o których mało kto wiedział... :]

Brałem pod uwagę typ TGuid, dlatego że jest zgodny rozmiarem z tablicą z zadania, ale nie chciało mi się już kombinować; Mimo wszystko gratuluję zwycięzcom, a Patrykowi kolejnych pomysłów na konkursy; Jak już teraz przestudiuje się budowę kompilatora FPC i jego wewnętrzne mechanizmy dotyczące parsowania kodu, to może następnym razem uda się znaleźć rozwiązanie :D

PS: TGuid to jedyny typ rekordu, który zajmuje tyle samo miejsca w pamięci, co tablica z zadania.

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