2013-08-26 9 views
8

Naprawdę nie rozumiem dokładnie stosu.Lua C API: jaka jest różnica między lua_gettop() i -1?

lua_gettop() 

Zwraca indeks górny element stosu. Ponieważ indeksy zaczynają się od 1, wynik ten jest równy liczbie elementów w stosie (tak więc 0 oznacza pusty stos).

więc jaka jest różnica między nim a -1?

lua_getglobal(L,"Foo"); 
if(lua_isfunction(L,lua_gettop(L))) { 

lua_getglobal(L,"Foo"); 
if(lua_isfunction(L,-1)) { 
+5

'lua_gettop()' jest funkcją, podczas gdy '-1" jest literałem całkowitym. –

+5

Myślisz, że jestem idiotą? – deepspace

+5

Nie, nie mam. Twoje pytanie nie pasuje jednak do Stack Overflow. –

Odpowiedz

13

Możesz sobie wyobrazić, że stos rośnie od dołu, z dolnym (tj. Pierwszym pchanym) elementem posiadającym indeks 1, następnie wciskasz inny element (indeks 2), a następnie inny (indeks 3), itd. więc masz taką sytuację:

+-----------------------+ 
| element with index 6 | <-- top ("relative" index -1) 
+-----------------------+ 
| element with index 5 | <-- -2 
+-----------------------+ 
| element with index 4 | <-- -3 
+-----------------------+ 
| element with index 3 | <-- -4 
+-----------------------+ 
| element with index 2 | <-- -5 
+-----------------------+ 
| element with index 1 | <-- bottom ("relative" index -6) 
+-----------------------+ 

można również powiedzieć, że „normalne index” (jeden indeksowanie od dołu) jest absolutnym indeks elementu (jak w przypadku tablicy w C, oprócz począwszy od 1). Zamiast tego indeks ujemny jest "względny" względem wierzchołka stosu. lua_gettop podaje bezwzględny indeks górnego stosu (który ma zawsze względny indeks -1).

Dlaczego istnieją dwa sposoby indeksowania stosu, a następnie? Ponieważ czasami przydatne jest uzyskiwanie dostępu do elementów takich jak tablica (przy użyciu indeksu bezwzględnego), a czasami wystarczy uzyskać dostęp do ostatnio pchanych elementów (czyli indeksować od góry).

Przy okazji, zwykle wizualizuję stos Lua odwrócony: zaczynając od góry i rosnąc w dół (tj. Wierzchołek stosu znajduje się w dolnej części mojej reprezentacji mentalnej). Uważam, że ten model mentalny jest bardziej przydatny, ponieważ interpretuję indeks -1 jako "cofam się w kodzie (w górę, w związku z tym), aż znajdziesz pierwsze naciśnięcie". W ten sposób indeks -2 będzie "cofać kod, dopóki nie znajdziesz drugiego naciśnięcia", itd .. Wszystko to pomaga mi szybko zidentyfikować, gdzie pchnąłem co.

Jednak, aby uniknąć nieporozumień, użyłem tutaj bardziej klasycznej reprezentacji, w której wierzchołek stosu jest naprawdę u góry!

+0

To świetnie! Niezła odpowiedź. – deepspace

2

Nie ma różnicy, jeśli natychmiast wykorzystasz go jako taki indeks. Ale możesz robić z nim inne rzeczy, np. Przechowywać indeks i używać go później, kiedy nie może być już ostatnim indeksem.

4

Z PIL (http://www.lua.org/pil/24.2.3.html)

Należy zauważyć, że ujemny wskaźnik X jest równoważne dodatni wskaźnik gettop - x + 1.

Dlatego

if(lua_isfunction(L,lua_gettop(L))) { 

czyni tak samo jak

if(lua_isfunction(L,-1)) { 
+2

Nie, gdy 'lua_gettop' zwraca 0. – lhf

0

Jak już wspomniano, lua_gettop zwraca indeks najwyższego elementu na stosie. Jeśli stos jest pusty, nie ma elementu na indeksie -1. Tak więc funkcja lua_gettop daje ci granicę dla indeksu, którego możesz użyć.

Powiązane problemy