Jak przekazać strukturę danych w menu?
Best Answer
Rivit
13.07.2017 15:43
int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max) { register cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr)); register cell* start = dest; #if defined BINLOG_ENABLED if (g_binlog_level & 2) { CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx); if (pl) g_BinLog.WriteOp(BinLog_SetString, pl->getId(), amx_addr, max, source); } #endif while (max-- && *source) *dest++ = (unsigned char)*source++; *dest = 0; return dest - start; }
//Gets info about a menu option //native menu_item_getinfo(menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback); static cell AMX_NATIVE_CALL menu_item_getinfo(AMX *amx, cell *params) { GETMENU(params[1]); menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2])); if (!pItem) return 0; cell *addr = get_amxaddr(amx, params[3]); addr[0] = pItem->access; set_amxstring(amx, params[4], pItem->cmd.chars(), params[5]); set_amxstring(amx, params[6], pItem->name.chars(), params[7]); if (params[8]) { addr = get_amxaddr(amx, params[8]); if (addr) addr[0] = pItem->handler; } return 1; }
Chyba ta pętla
while (max-- && *source) *dest++ = (unsigned char)*source++;
wrażliwa jestna ten terminator stringa, aczkolwiek mogę się mylić
Go to the full post
_McHappy
13.07.2017
Witajcie.
Czy istnieje możliwość przekazania poprzez parametr 'info': menu_additem(iMenu, szNazwaPozycji, szInfoPozycji)
struktury danych w stylu:
enum g_enumJakisZbior { iZmienna, szZmienna[16], szZmienna2[32], iZmienna2 }
?
Gdy próbuję wykonać podobną akcję, argument info[] funkcji menu_item_getinfo() zawiera elementy struktury do pierwszej zmiennej tekstowej włącznie, tzn. jedynie iZmienna oraz szZmienna przekazane prawidłowo.
Pozostałe są zwyczajnie równe wartości początkowej (0).
Nie wiem, czy chodzi może o terminację string'a ('^0'), czy coś w tym stylu?
Dla zobrazowania o co chodzi:
Best Answer
Rivit
13.07.2017
int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max) { register cell* dest = (cell *)(amx->base + (int)(((AMX_HEADER *)amx->base)->dat + amx_addr)); register cell* start = dest; #if defined BINLOG_ENABLED if (g_binlog_level & 2) { CPluginMngr::CPlugin *pl = g_plugins.findPluginFast(amx); if (pl) g_BinLog.WriteOp(BinLog_SetString, pl->getId(), amx_addr, max, source); } #endif while (max-- && *source) *dest++ = (unsigned char)*source++; *dest = 0; return dest - start; }
//Gets info about a menu option //native menu_item_getinfo(menu, item, &access, command[], cmdlen, name[]="", namelen=0, &callback); static cell AMX_NATIVE_CALL menu_item_getinfo(AMX *amx, cell *params) { GETMENU(params[1]); menuitem *pItem = pMenu->GetMenuItem(static_cast<item_t>(params[2])); if (!pItem) return 0; cell *addr = get_amxaddr(amx, params[3]); addr[0] = pItem->access; set_amxstring(amx, params[4], pItem->cmd.chars(), params[5]); set_amxstring(amx, params[6], pItem->name.chars(), params[7]); if (params[8]) { addr = get_amxaddr(amx, params[8]); if (addr) addr[0] = pItem->handler; } return 1; }
Chyba ta pętla
while (max-- && *source) *dest++ = (unsigned char)*source++;
wrażliwa jestna ten terminator stringa, aczkolwiek mogę się mylić
_McHappy
13.07.2017
Chyba ta pętla
while (max-- && *source)
*dest++ = (unsigned char)*source++;
wrażliwa jestna ten terminator stringa, aczkolwiek mogę się mylić
Jeszcze to rzutowanie 0.0, na co to komu...
O niebo lepiej byłoby gdyby pozwolili przekazywać prostą tablicę...
No nic, pozostaje formatex i ładowanie danych do string'a...
Dzięki za źródło.
Rivit
13.07.2017
Zauwaz że taka strukturka co sobie zrobiłeś to jest w rzeczywistości prosta tablica, tylko że odwołujesz się do poszczególnych komórek.
Może format(ex) + parse jakieś, nie wiem. Albo obejdź i globalna tymczasowa strukturka
Ogen Dogen
13.07.2017
Enum to nie struktura tylko typ wyliczeniowy W AMXX jedynymi strukturami są tablice, a to co próbujesz osiągnąć jest możliwe w normalnym języku programowania przez tablice asocjacyjne. (przechowujące klucz + wartość)
Tutaj pozostaje ci tylko tablica i odwoływanie się po indeksach.
Rivit
13.07.2017
Kiedys robiłem coś takiego (może podobne), miałem chyba z 6 parametrów do przesłania. Dajmy na to tablica 64. Pierwsze 6 komórek to były pozycje od których się zaczynają dane. Potem pętlą wyodrębniałem dane do struktury.
Tak jakby na początku tablicy miałem takie 'spis treści' a potem skakałem sobie do tych miejsc. Dziś uważam że to było wymyślanie koła na nowo, ale doświadczenie zawsze się przydaje.
_McHappy
13.07.2017
W normalnym języku prog. to cuda niewidy można robić

Pomysł z pre-indeksowaniem przyznam - ciekawy (szczególnie jeśli chodzi właśnie o stringi), ale stawiam na prostotę i czytelność

Globalna struktura-enum odpada - zbyt duży rozmiar (64x7 pozycji w najgorszym przypadku).
Miałem rozwiązanie z wykorzystaniem wbudowanego parsera, ale ten enum mnie cholernie swędział.
Edited by _McHappy, 13.07.2017 19:16.
Ogen Dogen
13.07.2017
Kiedys robiłem coś takiego (może podobne), miałem chyba z 6 parametrów do przesłania. Dajmy na to tablica 64. Pierwsze 6 komórek to były pozycje od których się zaczynają dane. Potem pętlą wyodrębniałem dane do struktury.
Tak jakby na początku tablicy miałem takie 'spis treści' a potem skakałem sobie do tych miejsc. Dziś uważam że to było wymyślanie koła na nowo, ale doświadczenie zawsze się przydaje.
Raczej nie odkryłeś Ameryki, bo coś podobnego używa się w strukturach plików i pakietów.
Rivit
13.07.2017
_McHappy
13.07.2017
#można zamknąć