Tablica zmiennych interpretatora skryptow

0

Jak wskazuje temat pisze teraz interpretator dosc prostego jezyka skryptow, ktory ma obslugiwac zachowania obiektow w grze w reakcji na odpowiednie "zdarzenia". Mam juz ladnie rozpisana skladnie na kartce, odpowiednie metody do tlumaczenia kodu, ale napotkalem na problem.

Przewiduje, ze kazdy skrypt bedzie obslugi oprocz zmiennych globalnych, wbudowanych w silnik gry, bedzie mial mozliwosc definiowania zmiennych lokalnych w 4 podstawowych typach: integer, single, string i boolean. Pierwsze co przyszlo mi do glowy, to 4 tablice dynamiczne, oraz tablica rekordow z przyporzadkowaniem nazwa zmiennej -> indeks tablicy. To rozwiazanie jednak nie wydaje mi sie zbyt eleganckie. Czy ma ktos jakis lepszy pomysl?

ale sie rozpisalem...

0

...interpretera. I nie będzie wygodniej zrobić tego na zmiennych wariantowych?

0

Wlasnie obawiam sie, ze warianty moga pozerac sporo pamieci. W sumie nigdy z nich nie korzystalem, wiec nie wiem jak to wyglada.

0

Zmienna wariantowa zajmuje 16 bajtów. Może przechowywać dosłownie "wszystko" (wiadomo, wyłączenia są). Do tego cała otoczka wspomagająca znajdująca się w module Variants (VarIsNull, VarIsFloat) itp. Niemniej uzywanie ich wymaga rozwagi i dużej odpornosci programu na błędy. Co do podziału wartość-nazwa to nie bardzo. Będziesz pilnował integralności referencyjnej? To lepiej już trzymać tablice rekordów

type
  IntRec = record
    Name :string[20];
    Value :LongInt;
  end;

  BoolRec = record
    Name :string[20];
    Value :Boolean;
  end;

Można pokusić się o deklarację wariantową samego rekordu. Ja bym jednak się w to nie pchał.

Co do pojemności. Ustal maksymalny rozmiar tablicy na 100 zmiennych i po kłopocie. Wydatek pamięciowy przy obecnych pamięciach (1GB to już praktycznie standard) a będziesz miał tylko jedną tablicę. Nie wiem co dla Ciebie będzie wygodniejsze. Obsługa czterech typowanych, czy jednej ale mieszanej.

W tablicy wariantowej dodałbym też rekord informujący o typie danej aby nie musieć za każdym razem bawić się w używanie funkcji:

const
  VAR_INTEGER = 0;
  VAR_BOOLEAN = 1;

type
  TVarRec = record
    Name :string[20];
    VarType :Byte;
    Value :Variant;
  end;

Można też użyć typ wyliczeniowy.

0

Dzieki Adam, nie pierwszy raz mi pomagasz [browar]

Z tą tablica rekordow to bardzo dobry pomysl, ale pole mowiace o typie jest troche zbedne. Zajrzalem do dokumentacji i znalazlem funkcje VarType(), ktora przekazuje typ zmiennej wariantowej.

Wszystkie te rekordy umieszcze w tablicy dynamicznej, dla zaoszczedzenia pamieci.

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