SA-MP Forums

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

Reply
 
Thread Tools Display Modes
Old 12/01/2010, 05:37 PM   #11
MX_Master
Huge Clucker
 
Join Date: Jul 2007
Posts: 390
Reputation: 5
Default Re: Коллекция функций / макросов

ё-моё, какая замечательная вещь - этот символ #

Code:
#include <a_samp>

#define INTEGER_MACRO	1234
#define FLOAT_MACRO	3.1416
#define STRING_MACRO	"abc"

main()
{
	print
	(
		"INTEGER_MACRO = "	#INTEGER_MACRO	#\n\
		"FLOAT_MACRO = "	#FLOAT_MACRO	#\n\
		"STRING_MACRO = "	STRING_MACRO	#\n\
		#\n\
		# Hello\, World! Русские идут!
	);
}

Quote:
Originally Posted by ^Psycho^
MX_Master ты конечно крут, базара нет.. но многим ли людям это пригодиться?
...
Code:
if ( strcmp( cmdtext, "/goto_xyz", true, 9 ) == 0 )
{
	SetPlayerPos( playerid, fparam(cmdtext, _, 1), fparam(cmdtext, _, 2), fparam(cmdtext, _, 3) );
	return 1;
}

if ( strcmp( cmdtext, "/givemoney", true, 10 ) == 0 )
{
	GivePlayerMoney( iparam(cmdtext, _, 1), iparam(cmdtext, _, 2) );
	return 1;
}
возможны и более изощренные способы использоания
MX_Master is offline   Reply With Quote
Old 13/01/2010, 07:07 AM   #12
Konsul
Little Clucker
 
Join Date: Mar 2008
Posts: 1
Reputation: 0
Default Re: Коллекция функций / макросов

Quote:
Originally Posted by MX_Master
более мощные версии трёх моих же функций для извлечения праметров из строк, разделенных каким-то символом

sparam - извлекает подстроку под указанным номером, по желанию и вместе с остатком строки
iparam - извлекает подстроку под указанным номером и возвращает ее численное значение
fparam - извлекает подстроку под указанным номером и возвращает ее дробное (Float) значение

даю код.
в коде размер табуляции = 4.

Code:
/*
  ОПИСАНИЕ

    Строка source[] будет разделена на несколько подстрок
    с помощью символа delimiter. Нужная подстрока под номером (индексом)
    substrIndex будет помещена в строку dest[]


  ПАРАМЕТРЫ

    dest[]    сюда будет помещена нужная подстрока

    maxSize    макс. размер подстроки, которая будет помещена в dest[]
           если длина подстроки больше maxSize, то она урежется

    source[]   исходная строка для разбиения и поиска в ней подстрок

    delimiter   символ, который будет делить исходную строку на подстроки

    substrIndex  порядковый номер (индекс) подстроки в исходной строке

    withRest   это логический флаг, если равен 1, то в dest[]
           будут помещены все подстроки, начиная с указанного
           индекса substrIndex. В том числе и все символы delimiter,
           которые стоят между подстроками также будут включены в dest[]


  ВОЗВРАЩАЕТ

    ничего


  ПРИМЕРЫ

    new dest[128] = "something";

    sparam( dest, 20, "/register 123456", ' ', 0 ); // dest = "/register"
    sparam( dest, 20, "/register 123456", ' ', 1 ); // dest = "123456"
    sparam( dest, 5, "/register 123456", ' ', 0 ); // dest = "/reg"
    sparam( dest, 4, "/register 123456", ' ', 1 ); // dest = "123"

    sparam( dest, 20, "/pm 29 Как дела, бро?", ' ', 0 );  // dest = "/pm"
    sparam( dest, 4, "/pm 29 Как дела, бро?", ' ', 1 );  // dest = "29"
    sparam( dest, 10, "/pm 29 Как дела, бро?", ' ', 2 );  // dest = "Как"
    sparam( dest, 50, "/pm 29 Как дела, бро?", ' ', 2, 1 ); // dest = "Как дела, бро?"
    sparam( dest, 10, "/pm 29 Как дела, бро?", ' ', 3 );  // dest = "дела,"
    sparam( dest, 50, "/pm 29 Как дела, бро?", ' ', 3, 1 ); // dest = "дела, бро?"
    sparam( dest, 10, "/pm 29 Как дела, бро?", ' ', 4 );  // dest = "бро?"

    sparam( dest, 20, "91.235.141.89", '.', 0 );  // dest = "91"
    sparam( dest, 20, "91.235.141.89", '.', 1 );  // dest = "235"
    sparam( dest, 20, "91.235.141.89", '.', 2 );  // dest = "141"
    sparam( dest, 20, "91.235.141.89", '.', 3 );  // dest = "89"
    sparam( dest, 20, "91.235.141.89", '.', 1, 1 ); // dest = "235.141.89"
    sparam( dest, 20, "91.235.141.89", '.', 2, 1 ); // dest = "141.89"

    sparam( dest, 20, "/register 123456", ' ', -1 ); // dest = "", т.к. подстроки с таким индексом нет
    sparam( dest, 20, "/register 123456", ' ', 7 ); // dest = "", т.к. подстроки с таким индексом нет
*/

stock sparam
(
	dest[],				maxSize		= sizeof(dest),
	const source[],		delimiter	= ' ',
	substrIndex = 0,	withRest	= 0
)
{
	dest[0] = 0; // очистим строку назначения

	for ( new cur, pre, i = -1; ; cur++ ) // пробежимся по каждому символу в строке source
	{
		if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
		{
			if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
				// скопируем в dest нужную подстроку из source
				strmid( dest, source, pre, ( withRest ? strlen(source) : cur ), maxSize );

			return; // завершим работу функции
		}

		if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
		{
			if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
			{
				// скопируем в dest нужную подстроку из source
				strmid( dest, source, pre, ( withRest ? strlen(source) : cur ), maxSize );
				return; // завершим работу функции
			}

			pre = cur + 1;
		}
	}
}





/*
  ОПИСАНИЕ

    Строка source[] будет разделена на несколько подстрок
    с помощью символа delimiter. И нужная подстрока под номером (индексом)
    substrIndex будет возвращена функцией как число


  ПАРАМЕТРЫ

    source[]   исходная строка для разбиения и поиска в ней подстрок

    delimiter   символ, который будет делить исходную строку на подстроки

    substrIndex  порядковый номер (индекс) подстроки в исходной строке


  ВОЗВРАЩАЕТ

    целочисленное значение подстроки


  ПРИМЕРЫ

    new number = 555;

    number = iparam( "/givecash 23 50000", ' ', -1 ); // number = 0, т.к. подстроки с таким индексом нет
    number = iparam( "/givecash 23 50000", ' ', 0 ); // number = 0
    number = iparam( "/givecash 23 50000", ' ', 1 ); // number = 23
    number = iparam( "/givecash 23 50000", ' ', 2 ); // number = 50000
    number = iparam( "/givecash 23 50000", ' ', 3 ); // number = 0, т.к. подстроки с таким индексом нет
*/

stock iparam ( const source[], delimiter = ' ', substrIndex = 0 )
{
	for ( new dest[12], cur, pre, i = -1; ; cur++ ) // пробежимся по каждому символу в строке source
	{
		if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
		{
			if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
				strmid( dest, source, pre, cur, 12 ); // скопируем в dest нужную подстроку из source

			return strval(dest); // завершим работу функции и вернем целочисленное значение подстроки
		}

		if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
		{
			if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
			{
				strmid( dest, source, pre, cur, 12 );// скопируем в dest нужную подстроку из source
				return strval(dest); // завершим работу функции и вернем целочисленное значение подстроки
			}

			pre = cur + 1;
		}
	}
}





/*
  ОПИСАНИЕ

    Строка source[] будет разделена на несколько подстрок
    с помощью символа delimiter. И нужная подстрока под номером (индексом)
    substrIndex будет возвращена функцией как дробное число


  ПАРАМЕТРЫ

    source[]   исходная строка для разбиения и поиска в ней подстрок

    delimiter   символ, который будет делить исходную строку на подстроки

    substrIndex  порядковый номер (индекс) подстроки в исходной строке


  ВОЗВРАЩАЕТ

    дробное численное значение подстроки


  ПРИМЕРЫ

    new Float: float = 555.5;

    float = iparam( "/goto -157.2 1248.25 10", ' ', -1 ); // float = 0.0, т.к. подстроки с таким индексом нет
    float = iparam( "/goto -157.2 1248.25 10", ' ', 0 ); // float = 0.0, т.к. подстрока "/goto" это не число
    float = iparam( "/goto -157.2 1248.25 10", ' ', 1 ); // float = -157.2
    float = iparam( "/goto -157.2 1248.25 10", ' ', 2 ); // float = 1248.25
    float = iparam( "/goto -157.2 1248.25 10", ' ', 3 ); // float = 10.0
    float = iparam( "/goto -157.2 1248.25 10", ' ', 4 ); // float = 0.0, т.к. подстроки с таким индексом нет
*/

stock Float: fparam ( const source[], delimiter = ' ', substrIndex = 0 )
{
	for ( new dest[40], cur, pre, i = -1; ; cur++ ) // пробежимся по каждому символу в строке source
	{
		if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
		{
			if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
				strmid( dest, source, pre, cur, 40 ); // скопируем в dest нужную подстроку из source

			return floatstr(dest); // завершим работу функции и вернем дробное численное значение подстроки
		}

		if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
		{
			if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
			{
				strmid( dest, source, pre, cur, 40 );// скопируем в dest нужную подстроку из source
				return floatstr(dest); // завершим работу функции и вернем дробное численное значение подстроки
			}

			pre = cur + 1;
		}
	}
}
Замечательные функции, но
при компиляции выдает предупреждение: warning 209: function "fparam" should return a value*

*Использую:
getdata = dini_Get(fcoords,"coord");
CP[0] = fparam(getdata,',',0);
CP[1] = fparam(getdata,',',1);
CP[2] = fparam(getdata,',',2);
SetPlayerPos(playerid,CP[0],CP[1],CP[2]);
Konsul is offline   Reply With Quote
Old 13/01/2010, 08:58 AM   #13
CrunkBankS
Huge Clucker
 
CrunkBankS's Avatar
 
Join Date: Feb 2009
Location: Novorossiysk
Posts: 391
Reputation: 9
Default Re: Коллекция функций / макросов

return поставь
__________________

Music Producer

CrunkBankS is offline   Reply With Quote
Old 13/01/2010, 09:19 AM   #14
Konsul
Little Clucker
 
Join Date: Mar 2008
Posts: 1
Reputation: 0
Default Re: Коллекция функций / макросов

Quote:
Originally Posted by CrunkBankS
return поставь
И где ты его там собрался ставить?
Значение уже возвращает return floatstr(dest);
А я, собственно, понят не могу, что компилятору еще надо, когда значение уже возвращено (функция то работает корректно).
Konsul is offline   Reply With Quote
Old 13/01/2010, 12:17 PM   #15
Riaz
Big Clucker
 
Riaz's Avatar
 
Join Date: Oct 2007
Posts: 90
Reputation: 1
Default Re: Коллекция функций / макросов

return в самый низ функции какбы -_-
__________________
Tomsknet A/D :: 217.18.138.23:7776
Riaz is offline   Reply With Quote
Old 13/01/2010, 12:50 PM   #16
Konsul
Little Clucker
 
Join Date: Mar 2008
Posts: 1
Reputation: 0
Default Re: Коллекция функций / макросов

Quote:
Originally Posted by Alone_MAF1A
return в самый низ функции какбы -_-
Ты явно не понимаешь о чем говоришь:
попробуй поставить и получишь уже не предупреждение, а вполне закономерную ошибку
Konsul is offline   Reply With Quote
Old 13/01/2010, 02:42 PM   #17
MX_Master
Huge Clucker
 
Join Date: Jul 2007
Posts: 390
Reputation: 5
Default Re: Коллекция функций / макросов

Даже я, как высший разум, и то не могу приказать компилятору не орать про это return значение. Хотя его тоже можно понять, компилятора (: вдруг switch заклинит и он не найдет не единого нулевого байта, который завершает функцию. Если кто знает, скажите, где найти такой кляп для компилятора, который может его заставить не кричать предупреждение 209.

Вердикт - ничего не трогать и return'ы нигде там не ставить. Всё уже стоит на своих местах и все вычисления сведены к минимуму.

Quote:
Originally Posted by Konsul
...
*Использую:
getdata = dini_Get(fcoords,"coord");
CP[0] = fparam(getdata,',',0);
CP[1] = fparam(getdata,',',1);
CP[2] = fparam(getdata,',',2);
SetPlayerPos(playerid,CP[0],CP[1],CP[2]);
Если именно так использовать, то лучше прямо вот так и написать

Code:
getdata = dini_Get( fcoords, "coord" );
SetPlayerPos( playerid, fparam(getdata,',',0), fparam(getdata,',',1), fparam(getdata,',',2) );
MX_Master is offline   Reply With Quote
Old 13/01/2010, 06:21 PM   #18
Zeex
Guest
 
Posts: n/a
Default Re: Коллекция функций / макросов

Code:
stock Float: fparam ( const source[], delimiter = ' ', substrIndex = 0 )
{
	new dest[40];
	
	for ( new cur, pre, i = -1; ; cur++ ) // пробежимся по каждому символу в строке source
	{
		if ( source[cur] == 0 ) // если текущий символ в source - это символ конца строки
		{
			if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
				strmid( dest, source, pre, cur, 40 ); // скопируем в dest нужную подстроку из source

			break;
		}

		else if ( source[cur] == delimiter ) // если текущий символ в source - это символ для разделения строки
		{
			if ( ++i == substrIndex ) // если индекс текущей подстроки и есть sourceIndex
			{
				strmid( dest, source, pre, cur, 40 );// скопируем в dest нужную подстроку из source
				break;
			}

			pre = cur + 1;
		}
	}
	return floatstr(dest);
}


А вообще мне больше нравится вот так:

Code:
stock Float:fparam2(const source[], delimiter = ' ', substrIndex = 0)
{
	new dest[40];
	sparam(dest, sizeof(dest), source, delimiter, substrIndex);
	return floatstr(dest);
}
  Reply With Quote
Old 19/01/2010, 05:34 PM   #19
MX_Master
Huge Clucker
 
Join Date: Jul 2007
Posts: 390
Reputation: 5
Default Re: Коллекция функций / макросов

мобыть куму-то понадобится серверная закись азота для транспорта (:

Code:
#include <a_samp>

#define NOS_MULTIPLIER 1.15

public OnPlayerKeyStateChange ( playerid, newkeys, oldkeys )
{
	static veh, Float: velX, Float: velY, Float: velZ;

	if ( (newkeys & KEY_FIRE) && IsPlayerInAnyVehicle(playerid) )
	{
		veh = GetPlayerVehicleID(playerid);
		GetVehicleVelocity( veh, velX, velY, velZ );
		SetVehicleVelocity( veh, velX * NOS_MULTIPLIER, velY * NOS_MULTIPLIER, velZ * NOS_MULTIPLIER );
	}

	return 1;
}
лучше как FS ставить
MX_Master is offline   Reply With Quote
Old 19/01/2010, 05:51 PM   #20
^Woozie^
Big Clucker
 
^Woozie^'s Avatar
 
Join Date: Jul 2007
Posts: 83
Reputation: 15
Default Re: Коллекция функций / макросов

Вот, вырезал из спека своего.

Возвращает предыдущий ID.
Quote:
ReturnPreviousID(playerid,fromid)
{
new tmp,tmp2;
for(new i = fromid; i < GetMaxPlayers(); i--)
{
if(IsPlayerConnected(i) && i != playerid)
{
if(tmp == 0)
{
tmp = 1;
tmp2 = i;
}
}
}
return tmp2;
}
Возвращает следующий ID

Quote:
ReturnNextID(playerid,fromid)
{
new tmp,tmp2;
for(new i = fromid; i < GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i) && i != playerid)
{
if(tmp == 0)
{
tmp = 1;
tmp2 = i;
}
}
}
return tmp2;
}
//-----------------------------------------------------------------------------------------------------
Находим самый большой ID на сервере.
Quote:
GetHighestID(playerid)
{
new tmp,tmp2;
for(new i = GetMaxPlayers(); i >= 0; i--)
{
if(IsPlayerConnected(i) && PlayerSpawned[i] == 1 && i != playerid)
{
if(tmp == 0)
{
tmp = 1;
tmp2 = i;
}
}
}
return tmp2;
}
Находим самый маленький ID на сервере.
Quote:
GetLowestID(playerid)
{
new tmp;
new tmp2;
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i) && PlayerSpawned[i] == 1 && i != playerid)
{
if(tmp == 0)
{
tmp = 1;
tmp2 = i;
}
}
}
return tmp2;
}
^Woozie^ 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 1002 07/07/2017 06:56 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 03:39 PM.


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