SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 02/01/2010, 08:13 PM   #1
MX_Master
High-roller
 
Join Date: Jul 2007
Posts: 1,427
Reputation: 9
Default Коллекция функций / макросов

В общем разделе есть похожая темка, где человеки могут поделится очень ценными функциями или инструментами, не создавая никаких новых тем и релизов библиотек. Желающие могут запостить тут свои (возможно, чужие) функции, макросы и их описание. Естессна, от функции или макроса должен быть толк (:

* Желательно не более 5 штук в посте, а то всем будет не очень приятно читать и просматривать.
* Флуд из темы будет удаляться. Остаются только скрипты/функции/макросы и сообщения строго по теме.

Начну я с небольших но быстрых функций. Описание прямо в комментах в коде.
Вот код для тестирования - http://pastebin.mozilla-russia.org/103683.

Code:
/*
	Выдёргивает из строки source[], разделенной пробелами,
	подстроку под указанным индексом index и помещает ее
	в dest[]

	Фактически это шустрая замена strtok и похожих функций


	maxsize		это максимальная длина подстроки,
				если подстрока больше этой длина,
				то она будет урезана

	При вызове этой функции в ОЗУ выделяется
	не более 5 временных pawn ячеек (20 байт)


	ПРИМЕРЫ
		new dest[20], source[] = "/givecash 17 50000";

		sparam( dest, 20, source, -1 ); // в dest будет помещено "", т.к. такой индекс не существует
		sparam( dest, 20, source, 0 ); // в dest будет помещено "/givecash"
		sparam( dest, 20, source, 1 ); // в dest будет помещено "17"
		sparam( dest, 20, source, 2 ); // в dest будет помещено "50000"
		sparam( dest, 20, source, 3 ); // в dest будет помещено "", т.к. такой индекс не существует
*/
stock sparam ( dest[], maxsize = sizeof(dest), source[], index = 0 )
{
	dest[0] = 0;

	for ( new cur, pre, i = -1; ; cur++ )
	{
		switch ( source[cur] )
		{
			case ' ' :
			{
				if ( ++i == index )
				{
					strmid( dest, source, pre, cur, maxsize );
					return;
				}

				pre = cur + 1;
			}

			case 0 :
			{
				if ( ++i == index ) strmid( dest, source, pre, cur, maxsize );
				return;
			}
		}
	}
}




/*
	А это макрос, аналогичный функции sparam,
	который по логике должен работать еще быстрее,
	т.к. это вовсе не функция.

	Параметры и их порядок такой же как у функции sparam.

	При вызове этого макроса в ОЗУ выделяется
	не более 3 временных pawn ячеек (12 байт)
*/
#define  m_sparam(%0,%1,%2,%3)  %0[0]=0;for(new cur,pre,i=(-1);;cur++){switch(%2[cur]){case ' ':{if(++i==(%3)){strmid(%0,%2,pre,cur,(%1));break;}pre=cur+1;}case 0:{if(++i==%3)strmid(%0,%2,pre,cur,(%1));break;}}}
модер: подправил название, чтобы тема отражала смысл более четко
MX_Master is offline   Reply With Quote
Old 03/01/2010, 12:41 PM   #2
MX_Master
High-roller
 
Join Date: Jul 2007
Posts: 1,427
Reputation: 9
Default Re: Коллекция функций / макросов

еще парочка похожих функций, только для извлечения целых и дробных чисел

iparam

Code:
/*
	Выдёргивает из строки source[], разделенную пробелами,
	подстроку под указанным индексом index и возвращает ее
	числовое значение


	При вызове этой функции в ОЗУ выделяется
	не более 16 временных pawn ячеек (64 байта)


	ПРИМЕРЫ
		new targetPlayerID, sendMoney,
			source[] = "/givecash 17 50000";

		targetPlayerID	= iparam( source, 1 ); // в targetPlayerID будет помещено 17
		sendMoney		= iparam( source, 2 ); // в sendMoney будет помещено 50000
*/
stock iparam ( source[], index = 0 )
{
	for ( new dest[12], cur, pre, i = -1; ; cur++ )
	{
		switch ( source[cur] )
		{
			case ' ' :
			{
				if ( ++i == index )
				{
					strmid( dest, source, pre, cur, 12 );
					return strval(dest);
				}

				pre = cur + 1;
			}

			case 0 :
			{
				if ( ++i == index ) strmid( dest, source, pre, cur, 12 );
				return strval(dest);
			}
		}
	}
}

fparam

Code:
/*
	Выдёргивает из строки source[], разделенную пробелами,
	подстроку под указанным индексом index и возвращает ее
	дробное значение


	При вызове этой функции в ОЗУ выделяется
	не более 44 временных pawn ячеек (220 байт)


	ПРИМЕРЫ
		new targetPlayerID, Float:newHealth,
			source[] = "/sethealth 12 77.0";

		targetPlayerID	= iparam( source, 1 ); // в targetPlayerID будет помещено 12
		newHealth		= fparam( source, 2 ); // в sendMoney будет помещено 77.0
*/
stock Float:fparam ( source[], index = 0 )
{
	for ( new dest[40], cur, pre, i = -1; ; cur++ )
	{
		switch ( source[cur] )
		{
			case ' ' :
			{
				if ( ++i == index )
				{
					strmid( dest, source, pre, cur, 40 );
					return floatstr(dest);
				}

				pre = cur + 1;
			}

			case 0 :
			{
				if ( ++i == index ) strmid( dest, source, pre, cur, 40 );
				return floatstr(dest);
			}
		}
	}
}
скрипт для проверки - http://pastebin.mozilla-russia.org/103690
MX_Master is offline   Reply With Quote
Old 03/01/2010, 03:54 PM   #3
[JIeXa]
Big Clucker
 
Join Date: Jul 2008
Posts: 164
Reputation: 0
Default Re: Коллекция функций / макросов

Я канешна же нихера не понимаю в быстродействии, и вообще нуб, но всё же....

stock sparam (dest[], source[], index = 0)
{
new pos = 0, i = -1, nextpos = 0;
while (++i < index) pos = strfind(source, " ", true, pos), pos++;
nextpos = strfind(source, " ", true, pos);
if (nextpos == -1) nextpos = strlen(source);
strmid(dest, source, pos, nextpos, 100);
}

вот так мне нравится гораздо больше...
особенно потому, что более низкие уровни языков действуют гораздо быстрее...
т.е. если strfind написан на C++, то он будет в сто раз быстрее длиннющих циклов в pawn.

и небольшой модификат старой:

stock sparam (dest[], source[], index = 0) {
for (new cur, pre, i = -1;;cur++) {
if(source[cur] == ' ') {
if (++i == index) { strmid(dest, source, pre, cur, 50), break; }
pre = cur + 1;
}
if (source[cur] == 0) {
if (i == index) strmid(dest, source, pre, cur, 50);
break;
}
}
}

P.s. в С++ конечно предпочтение отдаю второму варианту.
[JIeXa] is offline   Reply With Quote
Old 03/01/2010, 06:11 PM   #4
Serafim_sd
Big Clucker
 
Join Date: Jul 2008
Posts: 198
Reputation: 10
Default Re: Коллекция функций / макросов

Возвращает UNIX-timestamp, необходимая вещь для создания веб-статистик и всего веб-прочего.
Code:
stock mktime(uhour,uminute,usecond,uday,umonth,uyear) {
	new timestamp2;

	timestamp2 = usecond + (uminute * 60) + (uhour * 3600);

	new days_of_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

	if ( ((uyear % 4 == 0) && (uyear % 100 != 0)) || (uyear % 400 == 0) ) {
			days_of_month[1] = 29;
		} else {
			days_of_month[1] = 28;
		}
	
	new days_this_year = 0;
	days_this_year = --uday;
	if(umonth > 1) {
		for(new i=0; i<umonth-1;i++) {
			days_this_year += days_of_month[i];
		}
	}
	timestamp2 += days_this_year * 86400;

	for(new j=1970;j<uyear;j++) {
		timestamp2 += 31536000;
		if ( ((j % 4 == 0) && (j % 100 != 0)) || (j % 400 == 0) ) timestamp2 += 86400;
	}
	return timestamp2;
}
ЗЫ нинада драца, давайте травите что у вас там есть)
Serafim_sd is offline   Reply With Quote
Old 17/09/2013, 01:51 PM   #5
therainycat
Banned
 
Join Date: Aug 2013
Location: namespace std;
Posts: 89
Reputation: 11
Default Re: Коллекция функций / макросов

gettime() религия не позволяет использовать?
therainycat is offline   Reply With Quote
Old 17/09/2013, 02:05 PM   #6
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,763
Reputation: 142
Default Re: Коллекция функций / макросов

Quote:
Originally Posted by therainycat View Post
gettime() религия не позволяет использовать?
поясняю для выскочек: функция склоняет слова, а не возвращает дату, т.е.:
Quote:
Мне 26 лет, а не 1 год. А моему племяннику 3 года.
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is offline   Reply With Quote
Old 19/09/2013, 05:07 PM   #7
therainycat
Banned
 
Join Date: Aug 2013
Location: namespace std;
Posts: 89
Reputation: 11
Default Re: Коллекция функций / макросов

Quote:
Originally Posted by Stepashka View Post

Цитата:
Сообщение от therainycat Посмотреть сообщение
gettime() религия не позволяет использовать?
поясняю для выскочек: функция склоняет слова, а не возвращает дату, т.е.:
Цитата:
Мне 26 лет, а не 1 год. А моему племяннику 3 года.
Quote:
Originally Posted by Serafim_sd View Post
Возвращает UNIX-timestamp, необходимая вещь для создания веб-статистик и всего веб-прочего.
Code:
stock mktime(uhour,uminute,usecond,uday,umonth,uyear) {
	new timestamp2;

	timestamp2 = usecond + (uminute * 60) + (uhour * 3600);

	new days_of_month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

	if ( ((uyear % 4 == 0) && (uyear % 100 != 0)) || (uyear % 400 == 0) ) {
			days_of_month[1] = 29;
		} else {
			days_of_month[1] = 28;
		}
	
	new days_this_year = 0;
	days_this_year = --uday;
	if(umonth > 1) {
		for(new i=0; i<umonth-1;i++) {
			days_this_year += days_of_month[i];
		}
	}
	timestamp2 += days_this_year * 86400;

	for(new j=1970;j<uyear;j++) {
		timestamp2 += 31536000;
		if ( ((j % 4 == 0) && (j % 100 != 0)) || (j % 400 == 0) ) timestamp2 += 86400;
	}
	return timestamp2;
}
ЗЫ нинада драца, давайте травите что у вас там есть)


Мой ответ был по поводу этого сообщения.
Во-первых, это чистой воды велосипед.
Во-вторых, на форуме нет порядка, никакого.
В-третьих, как я заметил, уровень "знаний" скриптинга здесь измеряется количеством сообщений и звездочками.

Я бы не стал с вашей стороны бросаться громкими словами, и еще не понятно, кто из нас выскочка. В следующий раз придержите свое мнение и хорошенько проанализируйте ситуацию.
therainycat is offline   Reply With Quote
Old 19/09/2013, 05:14 PM   #8
Stepashka
Godfather
 
Stepashka's Avatar
 
Join Date: Jul 2008
Location: near PC
Posts: 5,763
Reputation: 142
Default Re: Коллекция функций / макросов

Quote:
Originally Posted by therainycat View Post
Мой ответ был по поводу этого сообщения.
Во-первых, это чистой воды велосипед.
Во-вторых, на форуме нет порядка, никакого.
В-третьих, как я заметил, уровень "знаний" скриптинга здесь измеряется количеством сообщений и звездочками.

Я бы не стал с вашей стороны бросаться громкими словами, и еще не понятно, кто из нас выскочка. В следующий раз придержите свое мнение и хорошенько проанализируйте ситуацию.
Научитесь тогда цитировать, что бы было понятно кому вы отвечаете.
А уж когда научитесь пользоваться форумом - начнем говорить о скриптинге.
__________________
Клятва Страуструпа: "Я обязуюсь прилежно комментировать свой код, не использовать goto и следить за состоянием своих потоков и выделяемой памяти. Я обязуюсь не оставлять мусора в системе и избегать однобуквенных переменных. Ресет." © Куч
M&M GM
Status: ON HOLD

Stepashka is offline   Reply With Quote
Old 20/09/2013, 12:51 PM   #9
therainycat
Banned
 
Join Date: Aug 2013
Location: namespace std;
Posts: 89
Reputation: 11
Default Re: Коллекция функций / макросов

Quote:
Originally Posted by Stepashka View Post
Научитесь тогда цитировать, что бы было понятно кому вы отвечаете.
А уж когда научитесь пользоваться форумом - начнем говорить о скриптинге.
Спасибо огромное, что учите меня жить. Но увы, я настолько безнадежен, что не смогу освоить эту систему.
Обещаю исправиться, и простите, что не учел тот момент, что вы воспринимаете любое внимание на свой счет.
therainycat is offline   Reply With Quote
Old 03/01/2010, 07:02 PM   #10
[JIeXa]
Big Clucker
 
Join Date: Jul 2008
Posts: 164
Reputation: 0
Default Re: Коллекция функций / макросов

Code:
//       сорц строка, двумерный массив, разделитель
// разделяет строку по символу на куски в массив.
stock split(const strsrc[], strdest[][], delimiter)
{
	new i, li;
	new aNum;
	new len;
	while(i <= strlen(strsrc))
	{
	  if(strsrc[i]==delimiter || i==strlen(strsrc))
		{
	    len = strmid(strdest[aNum], strsrc, li, i, 128);
	    strdest[aNum][len] = 0;
	    li = i+1;
	    aNum++;
		}
		i++;
	}
	return 1;
}

// создать хэш таблицу
stock hmake(const name[]) return HLoad(name,"All");
// очистить хэш таблицу
stock hfree(const name[]) { HClose(name), HLoad(name, "All"); }
// узнать данные в хт,  единица данных какой номер
stock hgetv(const name[], const item[], value) {
	if(value > 0 && value < 11) {
		new ret[256];
		HGet(name, item, ret);
		new rst[11][10];
		split(ret,rst,',');
		return rst[value-1];
	}
}
добавить в хт, в ещё таблицу, и под номером таким та
stock haddv(const name[], const item[], value, const data[]) {
	if(value > 0 && value < 11) {
		new ret[512];
		HGet(name, item, ret);
		if(!equal(ret,"")) {
			new rst[11][50];
			split(ret,rst,',');
			strdel(ret,0,512);
			for(new i;i<11;i++) {
			  if(i == value) format(ret,sizeof(ret),"%s,%s",ret,data);
			  else if(i == 0) format(ret,sizeof(ret),"%s",rst[i]);
			  else format(ret,sizeof(ret),"%s,%s",ret,rst[i]);
			}
		} else { format(ret,sizeof(ret),"%s",data); }
	  HAdd(name, item, ret);
		return ret;
	}
	return ret;
}

; установить значение rgba в цвете.

stock setrgba(res,r,g,b,a)
{
  if(r != 0x00) { res = (res & 0x00ffffff) | (r << 24); }
	if(g != 0x00) { res = (res & 0xff00ffff) | (g << 16); }
	if(b != 0x00) { res = (res & 0xffff00ff) | (b << 8); }
	if(a != 0x00) { res = (res & 0xffffff00) | a; }
	return res;
}

// поставить значение альфа

stock seta(color,a)
	return color & 0xffffff00 | a;

; хз чо такое :)
// а ну, прибавить к альфе ещё маленька альфы :)
stock givea(color,a)
	return color | a;

;кол-во цифорок в числе
stock num(numb)
{
	new i = 10, d = 1;
	while(i<=numb) i*=10, d++;
	return d;
}

;узнать из цвета r g b a
stock getr(color)
	return (color & 0xFF000000) >> 24;
	
stock getg(color)
	return (color & 0x00FF0000) >> 16;
	
stock getb(color)
	return (color & 0x0000FF00) >> 8;
	
stock geta(color)
	return color & 0x000000FF;

;удаляем в строке от start до end
stock strdel2(str[], start, end)
{
	new str2[256];
	for(new i;i<start-1;i++) str2[i] = str[i];
	for(new i = end-1;i<strlen2(str);i++) str2[i - end + start] = str[i];
	return str2;
}

// копируем в dest из source данные от start, и len символов.

stock strmid3(dest[], source[], start, len) {
	for(new i = start;i < strlen(source) - (start - len + 1);i++) dest[i-start] = source[i];
}

// сортировка пузырьком.. ^^
stock BubbleSort(mass[])
{
	new top = 4 - 1;
	while(top != 0)
	{
		for(new i;i < top;i++)
		{
			if(mass[i] > mass[i+1])
			{
				new temp = mass[i];
				mass[i] = mass[i+1];
				mass[i+1] = temp;
			}
		}
		top--;
	}
}

// соединение строк

stock TooStrings(str[],str2[]) {
	new string2[256];
  format(string2,256,"%s%s",str,str2);
  return string2;
}

/*
-----------------------
это типа вставить строку string в source с pos'a(в соурс)
By Aleksey
-----------------------
*/
stock strins2(string[], source[], pos) {
	new len = strlen2(string);
	new str[256];
	for(new i = 0;i < pos;i++) str[i] = source[i];
	for(new i = pos;i < pos+len;i++) str[i] = string[i-pos];
	for(new i = pos+len;i < strlen2(source)+len;i++) str[i] = source[i-len];
	return str;
}

/*
-----------------------
возвращает N правых символов, если N < 0, то вовзращает символы от strlen2(string)+N до strlen2(string)
это м.. возвращает n правый символов(мона юзать -n)
By Aleksey
-----------------------
*/
stock right(string[],N) {
	new dest[256];
	if (N > 0) { for(new i = strlen2(string) - N;i < strlen2(string);i++) dest[i-(strlen2(string)-N)] = string[i]; }
	if (N < 0) { for(new i = strlen2(string) + N;i < strlen2(string);i++) dest[i-(strlen2(string)+N)] = string[i]; }
	return dest;
}
/*
-----------------------
возвращает N левых символов, если N < 0, то вовзращает символы от 0 до strlen2(string)+N
возвращает n левых символов, мона юзать -n
By Aleksey
-----------------------
*/
stock left(string[],N) {
	new dest[256];
	if (N > 0) { for(new i;i < N;i++) dest[i] = string[i]; }
	if (N < 0) { for(new i;i < strlen2(string)+N;i++) dest[i] = string[i]; }
	return dest;
}
/*
-----------------------
поиск findtext в source, с позиции pos(по умолчанию = 0)
находит позицию строки findtext в source с pos
By Aleksey
-----------------------
*/
stock strfind2(source[],findtext[],pos = 0) {
	new n;
	for(new i = pos;i < strlen2(source);i++) {
		for(new m;m < strlen2(findtext);m++) {
			if (source[i+m] == findtext[m] && n < strlen2(findtext)) n++;
			if (n == strlen2(findtext)) return i;
		}
		n=0;
	}
	return -1;
}
/*
-----------------------
возвращает длину строки
длина строки?
By Aleksey
-----------------------
*/
stock strlen2(str[]) {
	new c; while(str[c++]!=0) {}
	return c-1;
}
/*
-----------------------
копирование символов из source в dest, maxlength - макс. длина dest
эм..
соурс приравнивает в дест..
By Aleksey
-----------------------
*/
stock strcat2(dest[], source[],maxlength = sizeof(dest)) { for(new i;i<maxlength;i++) dest[i] = source[i]; }
/*
-----------------------
в dest копируются символы с source со start до end, maxlength - макс. длина dest
в дест копируется символы c source со start до end
By Aleksey
-----------------------
*/
stock strmid2(dest[], source[], start, end, maxlength = sizeof(dest)) {
	for(new i = start;i < end;i++) { if (strlen2(dest) < maxlength) dest[i-start] = source[i]; else break; }
}

/*
-----------------------
Конвентирует число s из fs системы счисления в fd систему счисления
строка, все числа в строке, конвентирует из fs системы счисления в fd.
By Aleksey
-----------------------
*/
stock conv(s[], fs, fd)
{
	new A, sd[256];
	for (new i; i < strlen2(s); i++)
	{
		new a = strval2(s[i]);
		if ((a >= 0) && (a <= fs)) A = A * fs + a;
		else break;
	}
	while (A != 0)
	{
		format(sd,sizeof(sd),"%s%s",valstr2(A % fd),sd);
		A /= fd;
	}
	return sd;
}

/*
-----------------------
Возвращает номер символа из таблицы ASCII
возвращает номер символа по ASCII
By Aleksey
-----------------------
*/
stock asc(S)
	return S;
/*
-----------------------
Возвращает символ по номеру в таблице ASCII
возвращает символ из номера символа по ASCII
By Aleksey
-----------------------
*/
stock chr(N) {
	new str[1];
	format(str,sizeof(str),"%s",N);
	return str;
}
....
[JIeXa] is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
SA-MP для Anderius, Criminal Russia, United и Gostown6 dimonml Русский/Russian 1009 28/02/2020 06:05 PM
Проблема с прорисовкой некоторых объект& ONIXS Русский/Russian 29 23/11/2011 04:24 PM
Символы, буковки, горячая замена ^Woozie^ Русский/Russian 23 27/02/2010 01:25 PM


All times are GMT. The time now is 02:34 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.