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

Foreach i Forrange implementacja pętli ułatwiających życie


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

#1 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

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

Napisano 09.06.2013 02:38

*
Popularny

http://darkgl.amxx.p...iajacych-zycie/
 
Często podczas prac nad pluginem w kodzie muszę „przeliterować” po elementach tablicy czy wszystkich graczach. Pisanie rozbudowanej pętli for jest meczące i nużące więc pomyślałem że foreach znane z php było by znacznym ułatwieniem.
 
http://php.net/manua...res.foreach.php
 
Najpierw opis samych funkcji ( które są tak naprawdę makrodefinicjami )
  • foreach – „przeliterowuje” po całej tablicy i przypisuje wartość aktulnie używanego elementu do zdefiniowanej zmiennej
    dwa parametry
    • 1 – tablica po której ma literować
    • 2 – nazwa zmiennej do której będzie zapisywany aktualny element
  • forrange2 – wylicza kolejne wartości liczbowe i przypisuje je do zmiennej. Inspirowalem się funkcją range w php i python
    dwa parametry ( liczba po nazwie określa ilość parametrów )
    • 1 – nazwa zmiennej do które będzie zapisywana aktualna wartość
    • 2 – górny indeks do którego nastąpi odliczanie, odliczanie startuje od 0 do właśnie tego parametru – 1 z krokiem inkrementacyjnym równym 1 np. 0 , 1 , 2 , 3
  • forrange3 – to samo co funkcja wyżej
    Trzy parametry
    • 1 – nazwa zmiennej
    • 2 – dolny indeks od którego zacznie się odliczanie
    • 3 – górny indeks tak jak parametr 2 w funkcji forrange2
      Przykład dla dolnego indeksu równego 3. 3 , 4 , 5 , 6
  • forrange4 – To samo co funkcje wyżej
    Cztery parametry
    • 1- nazwa zmiennej
    • 2- dolny indeks tak jak w forrange3
    • 3 – górny indeks tak jak w forrange3
    • 4- krok inkrementacji np. możemy ustawić go na 10 więc liczby bedą się zwiększac o 10 co każdy krok
      Przykład 0 , 10 , 20 , 30 , 40 , 50
Definicje które trzeba dodać do pluginu
 
 
#define foreach(%1,%2) for( new iCurrentElement = 0 , %2 = %1[ 0 ]; iCurrentElement < sizeof %1 ; iCurrentElement++ , %2 = iCurrentElement < sizeof %1 ? %1[ iCurrentElement ] : 0 )
#define forrange4(%1,%2,%3,%4) for( new %1 = %2; %1 < %3 ; %1 += %4 )        

#define forrange3(%1,%2,%3) for( new %1 = %2; %1 < %3 ; %1 += 1 )
    
#define forrange2(%1,%2) for( new %1 = 0; %1 < %2 ; %1 += 1 )
 
Przykład użycia
 
#include <amxmodx>
#include <amxmisc>

#define PLUGIN    "New Plugin"
#define AUTHOR    "DarkGL"
#define VERSION    "1.0"

#define foreach(%1,%2) for( new iCurrentElement = 0 , %2 = %1[ 0 ]; iCurrentElement < sizeof %1 ; iCurrentElement++ , %2 = iCurrentElement < sizeof %1 ? %1[ iCurrentElement ] : 0 )

#define forrange4(%1,%2,%3,%4) for( new %1 = %2; %1 < %3 ; %1 += %4 )        

#define forrange3(%1,%2,%3) for( new %1 = %2; %1 < %3 ; %1 += 1 )
    
#define forrange2(%1,%2) for( new %1 = 0; %1 < %2 ; %1 += 1 )
    
public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    new testArray[] = { 1 , 2 , 3 , 4 };
    
    foreach( testArray , value ){
        log_amx( "each %d" , value );
    }
    
    log_amx( "Range 1" );
    
    forrange2( value , 5 ){
        log_amx( "range1 %d" , value );
    }
    
    log_amx( "Range 2" );
    
    forrange3( value , 1 , 5 ){
        log_amx( "range2 %d" , value );
    }
    
    log_amx( "Range 3" );
    
    forrange4( value , 0 , 100 , 10 ){
        log_amx( "range3 %d" , value );
    }
}
 
Zwracane wartości
 
[testFor.amxx] each 1
[testFor.amxx] each 2
[testFor.amxx] each 3
[testFor.amxx] each 4
[testFor.amxx] Range 1
[testFor.amxx] range1 0
[testFor.amxx] range1 1
[testFor.amxx] range1 2
[testFor.amxx] range1 3
[testFor.amxx] range1 4
[testFor.amxx] Range 2
[testFor.amxx] range2 1
[testFor.amxx] range2 2
[testFor.amxx] range2 3
[testFor.amxx] range2 4
[testFor.amxx] Range 3
[testFor.amxx] range3 0
[testFor.amxx] range3 10
[testFor.amxx] range3 20
[testFor.amxx] range3 30
[testFor.amxx] range3 40
[testFor.amxx] range3 50
[testFor.amxx] range3 60
[testFor.amxx] range3 70
[testFor.amxx] range3 80
[testFor.amxx] range3 90
 
Jak widać funkcje znacznie ułatwiają przeglądanie tablic po za tym kod wygląda lepiej.
na wstępie mówiłem o

po elementach tablicy czy wszystkich graczach

jak widać najlepiej zastosowac tu funkcje forrange3
 
 
forrange( currentPlayerID , 1 , 33 )
( zamiast stałej 33 można też wstawić pobieranie ilości slotów )

Użytkownik DarkGL edytował ten post 09.06.2013 02:46

  • +
  • -
  • 17

#2 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 09.06.2013 02:42

Przepraszam, czy jest na forum ranga "Wymiatacz"? Albo "Geniusz"? Albo "Bóg"?... Nie? ... A mógłby ktoś utworzyć i przydzielić ją temu człowiekowi?

 

Jakbym nie był tak leniwy, to pewnie sam bym to zrobił, ale niestety... jestem :D


  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#3 Pan Marian

    Banned

  • Zbanowany

Reputacja: 89
Zaawansowany

  • Postów:283
  • Imię:Marian
  • Lokalizacja:इंटरनेट
Offline

Napisano 09.06.2013 07:15

DarkGL dzień jak co dzień na patencie



#4 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 09.06.2013 09:19

Kocham Cię Dark. :*


  • +
  • -
  • 0

#5 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 09.06.2013 10:38

Przyda się, niby to tylko po prostu ułatwia używanie pętli, no ale jednak to zawsze coś. Sam nie wpadłbym, żeby coś takiego zrobić, bo jednak do takich rzeczy trzeba mieć jakiś bodziec. Ogólnie przydało by się zrobić listę funkcji, których nie ma w pawnie, a mogą być przydatne i wtedy brać się do roboty za pisanie makrodefinicji lub funkcji.
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#6 Kewin. (ZeZ)

    Wszechobecny

  • Użytkownik

Reputacja: 130
Zaawansowany

  • Postów:465
  • GG:
  • Steam:steam
  • Imię:Kewin
  • Lokalizacja:Zgorzelec
Offline

Napisano 17.06.2013 13:16

Zna ktoś jakiś temat gdzie jest wytłumaczona funkcja "for" ?

A jesli takiej nie ma, to prosilbym o wytlumaczenie :)


  • +
  • -
  • 0

"Wiem, że nic nie wiem!"

...Nie jestem OWIECZKĄ!...

 

Pomagam przy DIABLOMODCORE i CODMOD

 

Pisz konkretnie, inaczej nie odpisze!


#7 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 17.06.2013 14:13

Zna ktoś jakiś temat gdzie jest wytłumaczona funkcja "for" ?
A jesli takiej nie ma, to prosilbym o wytlumaczenie :)

pętla for
  • +
  • -
  • 2

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#8 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 19.10.2013 00:14

Teraz tak tylko patrzę, czemu "%1 += 1", a nie "++%1"?
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#9 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 553
Godlike

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

Napisano 19.10.2013 12:23

przez %1 += %4 i moje lenistwo ;>


  • +
  • -
  • 0

#10 sharkowy

    Lokalna anomalia sejsmiczna o nieustalonej genezie.

  • Przyjaciel

Reputacja: 113
Zaawansowany

  • Postów:1 981
Offline

Napisano 21.10.2013 15:39

Nie wiem o co chodzi, ale podoba mi się to.


  • +
  • -
  • 0

#11 GT Team

    Ten lepszy xD

  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 21.10.2013 22:01

Takie pytanie, zapewne grałeś kiedyś w Colobot ( jak nie to polecam ! ). Tam jest taka funkcja
repeat(num)
W której wykonuje się czynnośc określoną ilość razy np
new i;
repeat(5)
{
     client_print(0,3,"%d", ++i);
}
Która funkcja najlepiej odwzorowuje to, albo jak stworzyc takie coś ? Tak?
#define repeat(%1) for(new i = 1;  i <= %1; i++)

sebul (21.10.2013 22:12):
Tak.

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#12 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 21.10.2013 23:01

forrange2(i, 5) zadziała dokładnie tak, jak repeat(5)


  • +
  • -
  • 0

NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark


#13 GT Team

    Ten lepszy xD

  • Zbanowany

Reputacja: 321
Wszechpomocny

  • Postów:1 435
  • GG:
  • Imię:Tomasz i Grzegorz
  • Lokalizacja:Wojkowice
Offline

Napisano 22.10.2013 15:21

Ale jest tam zmienna i, która jest nie potrzebna;p ( Mówimy o wersji z Colobot )

Nowa wersja Tower Defense 0.2 Alpha | Inne Mody -> Nowości

 


#14 DarkGL

    Nie oddam ciasteczka !

  • Autor tematu
  • Administrator

Reputacja: 6 553
Godlike

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

Napisano 23.10.2013 13:39

Narzut pamięciowy i czasowy w takim przypadku jest pomijalny colobot też tak pewnie robił tylko nie miałeś dostępu do zmiennej , chyba że "kopiował" kod x razy  ;>


  • +
  • -
  • 0




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

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