shape1
shape2
shape3
shape4
shape7
shape8

Оператор goto


noname_idk

Гуру
Пользователь
19.07.2015
4 046
7
787
0
Скриптер
В этом небольшом уроке постараюсь научить Вас использовать этот оператор, показать его плюсы и удобство.

goto - оператор в pawn, C++ (врать не буду, больше нигде их нигде не встречал, быть может где-то еще существует). Позволяет возвращаться к определенному участку кода. минуя другую.

В синтаксисе он подсвечивается: 
Uc1TVRL.png


В целом, конструкция выглядит так:

VAR://Любое название "метки"
/*Код*/
goto VAR;//Возвращаемся к этой "метке"

Пример. Нам нужно дать игроку рандомный номер телефона (пятизначный) таким образом, чтобы он не совпадал с номерами других игроков:

new number[MAX_PLAYERS];//Создаем переменную в начале мода, куда запишем номера телефонов игроков
//==========================
ADDNUMBER://Создаем метку для goto, куда потом сможем вернуться в любой момент
number[playerid] = 10000+random(9999);//Присваиваем игроку с ID playerid пятизначный рандомный номер телефона
for(new i = MAX_PLAYERS-1; i != -1; --i)//Создаем цикл, где будем перебирать все 500 игроков
{
if(!IsPlayerConnected(i))//Если игрок не подключен к серверу
continue;//Пропускаем эту интеграцию и переходим к i-1
if(i == playerid)//Если ID перебираемого игрока совпадает с ID нашего игрока
continue;//Пропускаем эту интеграцию, то есть переходим к i-1
if(number[playerid] == number)//Если номер нашего игрока совпадает с номером перебираемого игрока
goto ADDNUMBER;//возвращаемся к метке ADDNUMBER, то есть к строке №4.
}
Пример 2: простой.

new a, b;//Создаем переменные a и b
for(new i = 10; i != 0; --i)//Создаем цикл, который будет интегрироваться с десяти до нуля (10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
{
a++;//Увеличиваем значение a на единицу (то же самое, что и a += 1)
b+=3;//Увеличиваем значение b на три
if(b/a == 3)
goto METKA;//Переходим к метке, то есть пропускаем оставшиеся интеграции цикла
}
METKA://Создаем нашу метку, где будем аннулировать переменные
a = 0;
b = 0;


Подведем итоги. При помощи оператора goto можно быстро вернуться к определенному участку кода. Лично я использую его в случаях, подобных первому примеру, когда нужно придать определенной переменной рандомное значение, не совпадающей со значениями других. Стоит учесть одну важную вещь: действие метки ограничивается одним участком кода. Например, следующий пример не будет рабочим:

stock Test()
{
new a = 4;
a += random(2);
if(a == 9)
goto METKA1;
return true;
}
stock Test2()
{
METKA1:
new b = 8;
printf("%d", b);
return true;
}


Автор: @Elrmrnt-Kritik.

 
Последнее редактирование модератором: