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

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/manual/en/control-structures.foreach.php Najpierw opis samych funkcji ( które są tak naprawde makrodefinicjami )
    • foreach – „przeliterowuje” po całej tablicy i przypisuje wartość aktulnie używanego elementu do zdefiniowanej zmiennej dwa parametry
      • 1 – tablica po której trzeba przeliterować
      • 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 
#include 

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

4 komentarzy o “Foreach i Forrange implementacja pętli ułatwiających życie

  1. Możesz robić też funkcję repeat( num ), czyli funkcja która wykona się num razy. Coś z colobota 😛

Dodaj komentarz

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.