Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Jak przekazać strukturę danych w menu?Enum -> menu_item_getinfo()


Najlepsza odpowiedź 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ć

Przejdź do postu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
9 odpowiedzi w tym temacie

#1 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 13.07.2017 13:49

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? :D

 

Dla zobrazowania o co chodzi:

Spoiler

  • +
  • -
  • 0

#2 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 13.07.2017 15:43   Najlepsza odpowiedź

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ć


  • +
  • -
  • 1

#3 _McHappy

    Wszechwiedzący

  • Autor tematu
  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 13.07.2017 17:16


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.


  • +
  • -
  • 0

#4 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 13.07.2017 18:07

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 ;)


  • +
  • -
  • 0

#5 Ogen Dogen

    Czempion

  • Power User

Reputacja: 261
Wszechwidzący

  • Postów:837
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Dąbrowa Górnicza
Offline

Napisano 13.07.2017 18:39

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.


  • +
  • -
  • 0

b_350_20_360204_C20008_FFFFFF_000000.png 193.33.176.115:27015

 

94e23d811c.png

 


#6 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 13.07.2017 18:43

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.


  • +
  • -
  • 0

#7 _McHappy

    Wszechwiedzący

  • Autor tematu
  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 13.07.2017 19:11

Użyłem stwierdzenia "struktura danych" ponieważ ogólnie rzecz biorąc przekazywana zmienna zawiera w sobie dane różnych typów, co jest charakterystyczne właśnie dla struktur.

W normalnym języku prog. to cuda niewidy można robić :D

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ł.

Użytkownik _McHappy edytował ten post 13.07.2017 19:16

  • +
  • -
  • 0

#8 Ogen Dogen

    Czempion

  • Power User

Reputacja: 261
Wszechwidzący

  • Postów:837
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Dąbrowa Górnicza
Offline

Napisano 13.07.2017 19:49

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.


  • +
  • -
  • 0

b_350_20_360204_C20008_FFFFFF_000000.png 193.33.176.115:27015

 

94e23d811c.png

 


#9 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 381
Offline

Napisano 13.07.2017 20:01

Wiem że nie odkryłem, napisałem tylko jak ja sobie radziłem. Może autor wpadnie na jakiś pomysł
  • +
  • -
  • 0

#10 _McHappy

    Wszechwiedzący

  • Autor tematu
  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 13.07.2017 20:10

W obecnie rozpatrywanej sytuacji pozostanę przy starym, dobrym formatex'ie i parserze (optymalizacja)...
#można zamknąć
  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych