SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian > Релизы/Releases

Reply
 
Thread Tools Display Modes
Old 10/05/2013, 02:44 PM   #1
ZiGGi
High-roller
 
ZiGGi's Avatar
 
Join Date: Sep 2008
Location: Russia
Posts: 1,738
Reputation: 355
Default Автоматоны Pawn

В языке Pawn есть механизм состояний(автоматон) - это такая система, которая позволяет определить несколько копий одной функции для использования в различных условиях. Я начну объяснять с примера, ибо так получится более наглядно, а ниже подробно опишу эту систему.

Пример

Допустим нам нужно сохранить данные игрока и данные гонок, а также сообщить об этом игрокам и гонщикам соответственно. При обычной реализации код выглядит грязновато:

Code:
#include 

forward data_Save(type);
forward message_Save(type);

enum {
	players,
	races
}

main() {
	data_Save(players);
	message_Save(players);
}

public data_Save(type)
{
	switch (type) {
		case players: {
			// saving
		}
		case races: {
			// saving
		}
	}
}
public message_Save(type)
{
	switch (type) {
		case players: {
			// send message to player
		}
		case races: {
			// send message to racers
		}
	}
}

А реализация с помощью автоматонов выглядит очень элегантно:

Code:
#include 

forward data_Save();
forward message_Save();

main() {
	state dataType:players;
	data_Save();
	message_Save();
}

public data_Save() 
{
	// saving
}

public data_Save() 
{
	// saving
}

public message_Save() 
{
	// send message to players
}

public message_Save() 
{
	// send message to racers
}
Плюсы этого метода

А если понадобится добавить в список выше что-нибудь ещё? Код без автоматонов превратиться в огромный switch! А если вы, например, захотите перенести код сохранения данных гонки в файл race/data.inc? Тогда вам придётся создавать дополнительную функцию и заносить её туда! Но с автоматонами это делается гораздо проще.

Ещё можно отметить то, что конструкция, выполненная с помощью автоматонов, работает немного быстрее, чем функция с большим switch.

Теория

state

Этим кодом мы устанавливаем для dataType состояние players

Code:
state dataType:players;
Для проверок, связанных с автоматонами, есть сокращённое написание, например этот код:

Code:
state (var == 1) dataType:races;
эквивалентен этому:

Code:
if (var == 1) {
	state dataType:races;
}

entry()

Для автоматонов зарезервирована специальная функция entry(), которая вызывается при установке состояния.


Пример:

Code:
#include 

main() {
	printf("Hello");
	state entryTest:message;
	printf("World!");
}

entry() 
{
	printf("Test");
}

Результатом выполнения этого кода будет:

Code:
Hello
Test
World
Функции

Вы можете объявлять функции с одним состоянием:

Code:
stock echo(msg[]) <exType:one>
{
	print(msg);
}
С несколькими:

Code:
stock echo(msg[]) <exType:one,exType:two>
{
	print(msg);
}
(эта функция будет вызвана при состоянии one или two).


И с любым другим состоянием:

Code:
stock echo(msg[]) <>
{
	print(msg);
}
(эта функция будет вызвана если не было вызвано ни одной функции со своим состоянием).

Источник

Last edited by ZiGGi; 12/09/2018 at 12:00 AM.
ZiGGi is offline   Reply With Quote
Old 10/05/2013, 04:22 PM   #2
White_116
High-roller
 
Join Date: Sep 2010
Location: Russia/116
Posts: 1,481
Reputation: 69
Default Re: Автоматоны Pawn

Гуд. Где-то давно видел нечто подобное. + За разжёвывание.
__________________
White_116 is offline   Reply With Quote
Old 10/05/2013, 04:26 PM   #3
stabker
High-roller
 
Join Date: Mar 2012
Posts: 1,320
Reputation: 86
Default Re: Автоматоны Pawn

Спасибо, полезно. Можно ли их еще как-то применять (к переменным, например) ?
stabker is offline   Reply With Quote
Old 10/05/2013, 04:43 PM   #4
ZiGGi
High-roller
 
ZiGGi's Avatar
 
Join Date: Sep 2008
Location: Russia
Posts: 1,738
Reputation: 355
Default Re: Автоматоны Pawn

Quote:
Originally Posted by stabker View Post
Спасибо, полезно. Можно ли их еще как-то применять (к переменным, например) ?
К глобальным переменным можно, они будут доступны только в функциях своих состояний.
ZiGGi is offline   Reply With Quote
Old 10/05/2013, 05:23 PM   #5
-Stranger-
Gangsta
 
-Stranger-'s Avatar
 
Join Date: Mar 2010
Location: TCP/IPv4
Posts: 726
Reputation: 40
Default Re: Автоматоны Pawn

Я на программиста не учился, поэтому след предложение может быть глупым...
Получается что можно сделать так:

PHP Code:
#include <a_samp>

main() {
    
state load:object;
    
state load:pickup;
}

entry() <load:object>
{
    
printf("loading");
}

entry() <load:pickup>
{
    
printf("loading");


И второй вариант:
PHP Code:
#include <a_samp>

main() {
    
state load:object;
    
Load();
    
state load:pickup;
    
Load();
}

public 
Load() <load:object>
{
    
printf("loading");
}

public 
Load() <load:pickup>
{
    
printf("loading");

__________________
[Mess with the best, die like the rest]
Помог? - жми на . Тебе один клик, а мне приятно

Last edited by -Stranger-; 10/05/2013 at 05:58 PM.
-Stranger- is offline   Reply With Quote
Old 11/05/2013, 07:16 AM   #6
ZiGGi
High-roller
 
ZiGGi's Avatar
 
Join Date: Sep 2008
Location: Russia
Posts: 1,738
Reputation: 355
Default Re: Автоматоны Pawn

Quote:
Originally Posted by -Stranger- View Post
Я на программиста не учился, поэтому след предложение может быть глупым...
Получается что можно сделать так:
Да, всё верно.
ZiGGi is offline   Reply With Quote
Old 11/05/2013, 11:48 AM   #7
-Stranger-
Gangsta
 
-Stranger-'s Avatar
 
Join Date: Mar 2010
Location: TCP/IPv4
Posts: 726
Reputation: 40
Default Re: Автоматоны Pawn

Честно, не вижу разницы, или я не понял смысл. Мне куда проще и понятнее, на конкретном примере, сделать так:
PHP Code:
#include <a_samp> 

main() { 
    
Load_Object();  
    
Load_Pickup(); 


public 
Load_Object() 

    
printf("loading"); 


public 
Load_Pickup()

    
printf("loading"); 

__________________
[Mess with the best, die like the rest]
Помог? - жми на . Тебе один клик, а мне приятно

Last edited by -Stranger-; 11/05/2013 at 02:12 PM.
-Stranger- is offline   Reply With Quote
Old 16/02/2016, 12:26 AM   #8
Diman777
Huge Clucker
 
Diman777's Avatar
 
Join Date: Aug 2011
Location: Ростов-на-Дону
Posts: 438
Reputation: 22
Default Re: Автоматоны Pawn

Во 2-ом примере сверху, ты наверно забыл объявить
PHP Code:
forward message_Save(type); 
Приведи пример с переменными в двух вариантах - как выглядит обычное использование и с автоматонами.
Diman777 is offline   Reply With Quote
Old 16/02/2016, 07:13 PM   #9
ZiGGi
High-roller
 
ZiGGi's Avatar
 
Join Date: Sep 2008
Location: Russia
Posts: 1,738
Reputation: 355
Default Re: Автоматоны Pawn

Quote:
Originally Posted by Diman777 View Post
Во 2-ом примере сверху, ты наверно забыл объявить
PHP Code:
forward message_Save(type); 
Исправил, спасибо.

Quote:
Originally Posted by Diman777 View Post
Приведи пример с переменными в двух вариантах - как выглядит обычное использование и с автоматонами.
Не понял.
ZiGGi is offline   Reply With Quote
Old 16/02/2016, 07:47 PM   #10
Diman777
Huge Clucker
 
Diman777's Avatar
 
Join Date: Aug 2011
Location: Ростов-на-Дону
Posts: 438
Reputation: 22
Default Re: Автоматоны Pawn

Применить автоматоны можно к переменным? Если да, то приведи пример.
Diman777 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
[Plugin] Vectoral Pawn - STL Data containers for pawn Rancho Plugin Development 70 03/05/2017 07:41 PM
Forum bug with [pawn][/pawn] BBCODE Yuripe Everything and Nothing 4 06/10/2012 12:58 PM
[Tool/Web/Other] PAWN Scanner - Scan PAWN files for information. Slice Tools and Files 10 15/07/2012 07:09 PM
New to pawn, trying to convert some C code to pawn CHC Scripting Help 2 22/06/2012 05:09 AM
[Help With Pawn] Pawn and compiler is not working..... D_Less Client Support 3 09/03/2012 04:49 AM


All times are GMT. The time now is 03:57 PM.


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