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

[ROZWIĄZANE] Tworzenie tablicy w pętli (optymalne?)


Najlepsza odpowiedź BlackPerfum , 27.06.2014 13:04

Nie bardzo rozumiem Ciebie. Czyli wynika po jednym obrocie pętli zmienne z poprzedniego obrotu są czyszczone? Tak?

Nie :(

 

Wytłumacze o co chodzi w tym kodzie:

1. Pętla obraca się poraz pierwszy i zmienna "i" równa sie "0"

- wykonuje sie warunek nr. 1

- tworze zmienną "dane"1 i "dane2" (w tej kolejności)

- Wyświetlam aresy zmiennych z wynikiem "dane: x1 | dane2: x2"

 

 

 

Pamiętajmy iż x1 < x2

 

 

2.Pętla obraca się poraz drugi:

- wykonuje się warunek nr. 2

- tworze zmienną "dane2" i "dane" (w tej kolejności)

- Wyświetlam aresy zmiennych z wynikiem "dane: x1 | dane2: x2"

 

 

Wniosek: Po obrocie pętli zmienne mają te same adresy. Albo w jakiś sposób adresy zostały zapisane albo pamięć nie została zwolniona. Wtf?

Przejdź do postu


  • Zamknięty Temat jest zamknięty
11 odpowiedzi w tym temacie

#1 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 25.06.2014 08:18

Witam.

Mam taki skrawek kodu:

public zapisz_do_pliku()
{
		new sciezka[40];
		formatex(sciezka, charsmax(sciezka), "addons/amxmodx/staty%i.txt", iLicznik)

		for(new id = 1; id <= MAX_PLAYERS; id++)
		{
			if(is_user_connected(id))
			{
                                new dane[256];
				formatex(dane, charsmax(dane), "Nick: %s | Fragi: %i (%i HS)", nazwa_gracza[id], fragi_gracza[id], hs_gracza[id])
				write_file(sciezka, dane)
			}
		}
}

ta funkcja wywołuje się po każdym zabiciu (w client_death). Teraz pytanie. Czy jest to optymalne rozwiązanie? Bo wg mnie to tak:

  1. sciezka jest ciagle formatowana do tablicy
  2. tablica dane jest tworzona tyle razy ile jest graczy na serwerze

 

I nie wiem czy po jednym przebiegu pętli stworzy się x (x - ilosc graczy) tablic dane i będa zajmowały miejsce w pamięci (chodzi o taki nakładanie i rezerwowanie tej pamięci)?


  • +
  • -
  • 0

#2 dasiek

    Nie wiem, nie znam się, nie orientuję się, zarobiony jestem.

  • Junior Admin

Reputacja: 2 077
Godlike

  • Postów:5 706
  • Imię:Adaś
  • Lokalizacja:No teraz trochę dalej od WWy
Offline

Napisano 25.06.2014 09:05

nie widzę gdzie przekazujesz parametr ID do funkcji ale mniejsza ;)

 

Napisz proszę co chcesz osiągnąć (na przykładzie) - co do tego co widzę - ścieżka jest stała - możesz ją w zmienną Globalną wrzucić.

 


  • +
  • -
  • 0

#3 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 25.06.2014 09:09

nie widzę gdzie przekazujesz parametr ID do funkcji ale mniejsza ;)

 

Napisz proszę co chcesz osiągnąć (na przykładzie) - co do tego co widzę - ścieżka jest stała - możesz ją w zmienną Globalną wrzucić.

 

pętlą to robię. Po id wszystkich

 

ścieżka nie jest stała (już)

formatex(sciezka, charsmax(sciezka), "addons/amxmodx/staty_%i.txt", iLicznik)

iLicznik - numer rundy

 

Czyli trzeba formatować ją co wywołanie.

 

A co z pętlą i tworzeniem tablicy wewnątrz niej?

Czy za każdym przebiegiem pętli tworzona jest tablica?

1 - przebieg - tablica po raz pierwszy

2 - przebieg - tablica po raz drugi

...

 

Czy też jest to ta sama tablica przechowywana w pamięci?


  • +
  • -
  • 0

#4 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 25.06.2014 13:05

W przedstawionym kodzie najbardziej nieoptymalne jest uzywanie write_file (w najgorszym wypadku 32 razy) za kazdym razem jak ktoś kogoś zabije :D

Napisz nam co dokładnie chcesz osiągnąć a pokażemy najkrótszą/najoptymalniejszą drogę


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#5 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 25.06.2014 14:11

Kod jest dobry.
Co z tablicą dane? Ona jest tworzona co przebieg pętli i co sie z nią dzieje potem? Zostaje w pamięci czy sie usuwa?
  • +
  • -
  • 0

#6 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 25.06.2014 19:23

Jeśli pętla wykona się x (x!=1) razy to tablica dane powstanie 1 raz i zostanie usunięta 1 raz tzn. masz do niej dostęp tylko w pętli :(


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#7 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 25.06.2014 19:55

Czyli po skonczeniu sie petli to zostanie zwolniona pamiec?

A dlaczego np nie 5 razy (przy 5 obrotach) skoro jest to w petli?
  • +
  • -
  • 0

#8 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 555
Godlike

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

Napisano 25.06.2014 20:04

Bo przy każdym obrocie pętli pamięć która została zarezerwowana w niej zostaje zwolniona


  • +
  • -
  • 1

#9 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 25.06.2014 20:10

Optymalizacja pawn'a. Wywnioskowałem to z tego kodu:

for(new i;i<2;i++)
{
    if(i==0)
    {
        new dane
        new dane2
        log_amx("Dane: %i | Dane2: %i",get_var_addr(dane),get_var_addr(dane2))
    }

    if(i==1)
    {
        new dane2
        new dane
        log_amx("Dane: %i | Dane2: %i",get_var_addr(dane),get_var_addr(dane2))
    }
}

A wynik:

Dane: x1 | Dane2: x2
Dane: x1 | Dane2: x2

  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#10 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 26.06.2014 07:01

@UP

 

Nie bardzo rozumiem Ciebie. Czyli wynika po jednym obrocie pętli zmienne z poprzedniego obrotu są czyszczone? Tak?

 

 

@DarkGL

 

Dzięki o to chodziło.


  • +
  • -
  • 0

#11 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 459
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 27.06.2014 13:04   Najlepsza odpowiedź

Nie bardzo rozumiem Ciebie. Czyli wynika po jednym obrocie pętli zmienne z poprzedniego obrotu są czyszczone? Tak?

Nie :(

 

Wytłumacze o co chodzi w tym kodzie:

1. Pętla obraca się poraz pierwszy i zmienna "i" równa sie "0"

- wykonuje sie warunek nr. 1

- tworze zmienną "dane"1 i "dane2" (w tej kolejności)

- Wyświetlam aresy zmiennych z wynikiem "dane: x1 | dane2: x2"

 

 

 

Pamiętajmy iż x1 < x2

 

 

2.Pętla obraca się poraz drugi:

- wykonuje się warunek nr. 2

- tworze zmienną "dane2" i "dane" (w tej kolejności)

- Wyświetlam aresy zmiennych z wynikiem "dane: x1 | dane2: x2"

 

 

Wniosek: Po obrocie pętli zmienne mają te same adresy. Albo w jakiś sposób adresy zostały zapisane albo pamięć nie została zwolniona. Wtf?


Użytkownik BlackPerfum edytował ten post 27.06.2014 13:17

  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#12 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 28.06.2014 20:06

Moglby ktos podac czy adresy zostaly zapisane czy pamiec zwolniona?
  • +
  • -
  • 0




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

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