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

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