2009-08-01 22 views
9

Czy ktoś pls powiedz mi, jak poprawnie używać funkcji lua_pop() w C++.Jak poprawnie używać funkcji lua_pop()?

  • Czy powinienem zadzwonić, gdy używam funkcji lua_get *()? lubić.

    lua_getglobal (L, "coś");

    lua_pop (L, 1);

lub jak z niego korzystać? Czy śmieciarz usunie te rzeczy po przekroczeniu progu? Dzięki.

Odpowiedz

20

Zadzwoń pod numer lua_pop(), aby usunąć przedmioty ze stosu Lua. W przypadku prostych funkcji może to być całkowicie niepotrzebne, ponieważ rdzeń wyczyści stos w ramach obsługi zwracanych wartości.

Dla bardziej złożonych funkcji, a zwłaszcza dla kodu C, który wywołuje Lua, często trzeba pop rzeczy ze stosu, aby zapobiec wzrostowi stosu w nieskończoność.

Funkcja lua_getglobal() dodaje jedną pozycję do stosu, gdy jest wywoływana, co oznacza nil, jeśli globalny nie istnieje lub wartość określonej zmiennej globalnej. Posiadanie kopii tej wartości na stosie chroni ją przed śmieciarem tak długo, jak długo istnieje. Ta wartość musi pozostać na stosie tak długo, jak jest używana przez kod C, który go pobierał, ponieważ jeśli globalne zostały zmodyfikowane, kopia na stosie może być jedyną pozostałą referencją.

więc ogólne wzorce korzystania globalnym są czymś, takie jak:

void doMyEvent(lua_State *L) { 
    lua_getglobal(L, "MyEvent"); 
    lua_call(L, 0, 0); /* pops the function and 0 parameters, pushes 0 results */ 
} 

double getGlobalDouble(lua_State *L, const char *name) { 
    double d; 
    lua_getglobal(L,name); 
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */ 
    lua_pop(L,1);   /* pop the value to leave stack balanced */ 
    return d; 
} 

char *copyGlobalString(lua_State *L, const char *name) { 
    char *s = NULL; 
    lua_getglobal(L,name); 
    if (!lua_isnil(L,-1)) 
     s = strdup(lua_tostring(L,-1)); 
    lua_pop(L,1); 
    return s; 
} 

W ostatnim przykładzie, jestem ostrożny, aby skopiować zawartość ciąg, ponieważ wskaźnik zwracany przez lua_tostring() jest gwarantowana tylko być obowiązuje tak długo, jak długo wartość pozostaje na stosie. Wymaga, aby wywołujący z copyGlobalString() był odpowiedzialny za późniejsze wywołanie free().

Należy również zauważyć, że ostatnie wydania Lua manual zawierają notację wraz z każdą funkcją, która identyfikuje liczbę zużytych wpisów stosu, a numer jest przesuwany. Pomaga to uniknąć nieoczekiwanego wzrostu stosu.

+0

+1, styl komentarza Lua w kodzie C++? :-) –

+1

@nick ... facepalm! Teraz jest lepiej ;-) – RBerteig

+0

Hej! Dzięki za pomoc. I jeszcze jedno pytanie: Jaka jest różnica między wywołaniem lua_call (L, 0, 0); i lua_pop (L, 1); do usunięcia FUNKCJI ?? Mam na myśli, dlaczego używałeś lua_call (L, 0, 0) zamiast używać lua_pop (L, 1)? – Morpheus

Powiązane problemy