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

Tablice wielowymiarowe


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

#1 Robiin

    Godlike

  • Support Team

Reputacja: 1 106
Super Hero

  • Postów:2 048
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 12.04.2017 00:26

Cześć, chciałbym stworzyć tablicę trójwymiarową; przechowującą nazwę rangi, właściciela rangi (id) oraz identyfikator rangi.

Jak określić w kodzie po kolei każdą z wymienionych opcji tak, żeby przy formatowaniu przez %s można było zwrócić poszczególną z nich, np.

	format(nazwamenu, 512, "Twoja ranga: %s", ranga[id][TUTAJ_INDENTYFIKATOR RANGI, NP. 3])
	new menu = menu_create(nazwamenu, "menuhandler");

Dla przykładu 

 

Twoja ranga: Poczatkujacy

 

 

Przy warunkach 

if(ranga[id][index] == 3) format(ranga[id][identyfikator], 32, "Poczatkujacy")

  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#2 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

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

Napisano 12.04.2017 01:07

Tworzenie tablic dla mieszanych typów zmiennych nie jest optymalne.
Jak zapewne możesz zauważyć, by zapisać do tablicy tekst, potrzebujesz dajmy na to [32] pola tablicy.
W przypadku liczby wystarczy 1 pole;

Tworząc tablicę tab[33][3][32], gdzie kolejnymi wymiarami są: indeksy graczy, ilość "kategorii", maksymalna długość kategorii,
rezerwujesz owszem [32] pola na tekst, ale również po [32] pola na liczbę. Tak naprawdę zapis będzie odbywał się na jednym polu, pozostałe będą niewykorzystane.

Dlatego polecam rozdzielić tę jedną dużą na 2 mniejsze (tab_tekst[33][32] i tab_liczby[33][2]).
Wtedy przechodząc do sedna sprawy, na samej górze pluginu tworzysz makrodefinicję postaci: #define NAZWA WARTOSC, gdzie WARTOSC to nr pola tablicy (np. 0, 1, 2 itp), a nazwa to zrozumiały alias tego pola (w tej sytuacji).

 

Po tym zabiegu możesz operować na tablicy, np:

public Funkcja(id)
    tab[id][ID_RANGI] = OdczytajRange(id);

Dla ID_RANGI będącym makrodefinicją "#define ID_RANGI 0" (pole 0. drugiego wymiaru tablicy 'tab')

 

 


  • +
  • -
  • 0

#3 Ogen Dogen

    Czempion

  • Power User

Reputacja: 261
Wszechwidzący

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

Napisano 12.04.2017 01:16

Z tego co zrozumiałem to chyba chodzi o to coś takiego ?

new tab3d[5][5][32];
formatex(tab3d[0][0], 32, "aaa");

Ponad to może ci się przydać to https://amxx.pl/topi...iających-życie/

 

Ostatecznie też bym to rozbił na dwie tablice jak kolega wyżej ;)


  • +
  • -
  • 0

b_350_20_360204_C20008_FFFFFF_000000.png 193.33.176.115:27015

 

94e23d811c.png

 


#4 Robiin

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 106
Super Hero

  • Postów:2 048
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 12.04.2017 03:40

Tworzenie tablic dla mieszanych typów zmiennych nie jest optymalne.
Jak zapewne możesz zauważyć, by zapisać do tablicy tekst, potrzebujesz dajmy na to [32] pola tablicy.
W przypadku liczby wystarczy 1 pole;
Tworząc tablicę tab[33][3][32], gdzie kolejnymi wymiarami są: indeksy graczy, ilość "kategorii", maksymalna długość kategorii,
rezerwujesz owszem [32] pola na tekst, ale również po [32] pola na liczbę. Tak naprawdę zapis będzie odbywał się na jednym polu, pozostałe będą niewykorzystane.
Dlatego polecam rozdzielić tę jedną dużą na 2 mniejsze (tab_tekst[33][32] i tab_liczby[33][2]).
Wtedy przechodząc do sedna sprawy, na samej górze pluginu tworzysz makrodefinicję postaci: #define NAZWA WARTOSC, gdzie WARTOSC to nr pola tablicy (np. 0, 1, 2 itp), a nazwa to zrozumiały alias tego pola (w tej sytuacji).
 
Po tym zabiegu możesz operować na tablicy, np:

public Funkcja(id)
    tab[id][ID_RANGI] = OdczytajRange(id);
Dla ID_RANGI będącym makrodefinicją "#define ID_RANGI 0" (pole 0. drugiego wymiaru tablicy 'tab')
Dales przyklad pod konkretna odpowiedz jak w temacie, a tych przykladowych rang ma byc sporo i chodzi o dynamiczne zmiany nimi.

Ogen, wiem ze tablice wiecej niz dwuwymiarowe nie sa wydajne i zawadzaja bardziej niz pomagaja.

Ogolnie chodzi mi o np. Formatowanie rangi i przypisywanie jej identyfikatora, zeby mozliwy byl zwykly warunek if(ranga == 2)
  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#5 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

  • Postów:11 980
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 12.04.2017 04:32

A może tak https://amxx.pl/topic/42028-struktury/ ?


  • +
  • -
  • 0

#6 Robiin

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 106
Super Hero

  • Postów:2 048
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 12.04.2017 06:48

 

Wydaje mi się, że źle mnie zrozumieliście, lub źle to wyłumaczyłem.

 

Przypuśćmy, że od danej liczby fragów dodaje komuś rangę;

#include <amxmodx>
#include <amxmisc>
#include <csx>
#include <fakemeta>

#define PLUGIN "Plugin"
#define VERSION "0.1"
#define AUTHOR "aS"
#define TASK 666

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
}

public client_connect(id)
{
	if(is_user_bot(id))
		return
	
	new param[1]
	param[0] = id
	
	set_task(1.0,"ranga",TASK+id,param,1,"b")
}

public client_disconnect(id)
	if(task_exists(TASK+id))
	remove_task(TASK+id)

public ranga(param[])
{
	static staty[8], body[8]
	new ranga[30]
	new id = param[0]
	
	get_user_stats(id, staty, body)
	if (staty[0] >= 0 && staty[0] <= 50)
		format(ranga,29,"Poczatkowy")
}

Chciałbym dodać  do rangi początkowy identyfikator;

new ranga[30], identyfikator[33]
format(ranga,29,"Poczatkowy")
identyfikator[id] = 1;

Robiąc tak dalej, mam 6 rang. Do każdej z nich chcę przypisać identyfikator. Wystarczy, że zrobię przy formatowaniu każdej z nich "identyfikator[id] = wartosc"?

 

 

Z innej beczki; jeżeli gracz trzyma m4, funkcja zwróci mi nazwę broni jaki weapon_m4a1, chciałbym mieć tablicę 2-wymiarową, która; przechowa nazwę broni jako weapon_m4a1, i wyświetli nazwę broni jako M4A1. Nie mogę sformatować tablicy dwuwymiarowej, więc jak zapisać do tej samej tablicy te dane, wliczając w to ID?


  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#7 Master Yoga

    Support Team | Mocarz

  • Support Team

Reputacja: 136
Zaawansowany

  • Postów:275
  • Lokalizacja:Magistrala Adresowa
Offline

Napisano 12.04.2017 07:34

Wydaje mi się że ty źle zrozumiałeś.
Nie zapiszesz danych różnych typów w tej samej tablicy, dlatego musisz korzystać z struktury.

Co do drugiego pytania. Jeśli lubisz wygodę stwórz sobie tablice o wielkości największego indeksu broni + 1. Dla id elementów które nie mają odpowiednika w broniach zostawiasz pusta wartość.
Mając nazwę broni (weapon_xxx) bardzo łatwo możesz sobie zamienić ją na id broni ( CSW_XX ).
Rozwiązanie to jest opcjonalne bo mając właśnie te nazwę broni możesz tak jak napisałem wyżej zamienić ja na id + rozdzielić string w miejscu występowania znaku '_' dzięki czemu otrzymasz krótka nazwę broni.
  • +
  • -
  • 0

HTML ★ CSS ★ JAVASCRIPT ★ AJAX ★ JQUERY ★ PHP ★ C++ ★ PAWN ★ SQL ★ Objective-C++


MKW0tb8.pngMKW0tb8.pngMKW0tb8.png


#8 Robiin

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 106
Super Hero

  • Postów:2 048
  • Imię:Robert
  • Lokalizacja:Wrocław
Offline

Napisano 12.04.2017 10:06

Teoretycznie jezeli chodzi o identyfikator, to moge zrobic inkrementacje przy formatowaniu nowej rangi. Kazda ranga bedzie miala swoj identyfikator.

Chyba, ze sie myle, to mnie poprawcie
  • +
  • -
  • 0

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.





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

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