shape1
shape2
shape3
shape4
shape7
shape8

Единая тема! С чего начать изучение PAWN


Статус
Закрыто для дальнейших ответов.

gegelo

Освоившийся
Пользователь
20.05.2015
183
24
0
Всем привет, с вами gegelo. В данной теме представлена информация для новичков.​
 ​
Что такое PAWN?
 

Pawn - бестиповый процедурно-ориентированный встраиваемый скриптовый язык программирования с C-подобным синтаксисом. Компилятор (Pawno) генерирует P-код (байт-код), который запускается в виртуальных машинах, которых 17 штук (1 под GM, 16 под FS.) 
Особенности языка:

  • Возможность подключения модульных инклудов. Можно организовать аккуратную структуру исходного кода.
  • Pawn скрипты выполняются в одном потоке.
  • Код полностью состоит из одиночных, нет вложенных друг в друга функций. Функции могут быть доступными только в пределах скрипта или публичными (которые могут использоваться виртуальной машиной).
  • Все переменные хранятся либо в секции данных, либо в стеке.


 
Переменные:
 
Переменные – это ячейки памяти для хранения данных. В Pawn существует несколько типов переменных:
  • Целочисленные
  • Вещественные
  • Логические
Переменная целочисленного типа объявляется следующим образом:

new crmp;
 
Мы объявили переменную, у неё нет никакого значения - она является не инициализированной. Давайте инициализируем данную переменную, то есть присвоим ей значение:

new crmp = 10;
 
Переменная вещественного типа объявляется следующим образом:

new Float:crmp = 10.5;
 
Она хранит в себе только десятичные числа. Объявляется она так же, как и переменная целочисленного типа, только перед именем переменной пишется приставка "Float:".
 
Переменная логического типа:

new bool:crmp = true;
 
Она хранит в себе 2 значения. true - истина, false - ложь. Как и в переменной вещественного типа, перед именем должна быть приставка "bool:".
 

Ещё переменные могут быть локального и глобального типа.
 
Глобальные переменные - переменные к которым можно обратиться из любой части кода.
Локальные переменные - переменные, которые находятся внутри тела какой-либо функции, и доступны только внутри данной функции.
в Pawn есть уже зарезервированные ключевые слова, которые нельзя использовать в качестве имён:

assert    break   case   char
const   continue   default   defined
do   else   enum   exit
for   forward   goto   if
native   new   operator   public
return   sizeof   sleep   state
static   stock   switch   tagof
while
 
Операторы: 
 
Тема: Операторы PAWN.  Автор: Amfy
Тема: Тернарный оператор   Автор: Amfy
Тема: Операторы Break и Continue   Автор: Neat

Тема: Циклы, переключатель (switch), break, continue   Автор: Compan

Оператор sizeof:

sizeof - оператор, использующийся для получения размера переменных
new someVar[10];
printf("%d", sizeof(someVar));

Основной плюс использования оператора sizeof - простота изменения кода. Представьте себе ситуацию, когда в вашем коде более 28 тысяч строк и вам нужно изменить в нём размер одного из массивов - тогда вам придётся перерывать весь код, чтобы изменить конечные значения в циклах, в которых обрабатывается данный массив, в ветвлениях (if/case) и т.д.
Всего этого можно избежать, используя оператор sizeof: компилятор Pawn сам возьмёт на себя рутинную работу по расчёту размера массивов. © Daniel_Cortez.
 
Оператор Switch:

Оператор switch используется в Pawn для выполнения действий по нескольким (чаще всего 2 и более) ветвям.
switch(<выражение>)
{
case <диапазон1>:
{
<действия1>;
}
case <диапазон2>:
{
<действия2>;
}
default:
{
<действия_иначе>;
}
}


Действия в метке default выполняются в том случае, когда значение выражения в switch не принадлежит ни одному из интервалов. Метка default не обязательна.
Главное преимущество switch перед if - эффективность: если в конструкции switch указано несколько диапазонов, принадлежность к одному из них определяется быстрее, чем в if.
switch(crmp)
{
case 0: //Если crmp == 0
{
crmp = 1;
}
case 1..3: //В диапазоне от 1 до 3
{
crmp = 4;
}
default: //Если иначе
{
crmp = 5;
}
}


Директивы:
 

Тема:  Директивы  Автор: Neat


Массивы:

Массив — упорядоченный набор данных, для хранения данных одного типа, идентифицируемых с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа.

Массивы так же, как и переменные бывают нескольких видов - одномерные, двумерные и трёхмерные. И нескольких типов - вещественные и целочисленные.
new CrmpMass[3] = {121,122,123};// - одномерный массив целочисленного типа.

Выше мы создали инициализированный массив из 3 ячеек. Обращаемся к ним по индексам ячеек: 0,1,2

CrmpMass[2]; //Ссылка к ячейке со значением 123
Код:
CrmpMass[2] = 125; //Изменяем значение ячейки на 125
Массив вещественного типа:

new Float:CrmpMassive[3] = {121.21,122.22,123.23}; //Одномерный массив вещественного типа.
Так же как и с переменными вещественного типа, перед именем пишется приставка "Float:". Ссылаемся и изменяем значение так же, как и с целочисленным типом. 

Одномерные массивы ещё используют для всех игроков. Создавая большой массив, который равен максимальному кол-ву игроков на сервере. В Pawn есть встроенная константа MAX_PLAYERS, равная 1000 игрокам.
new CrmpPlayers[MAX_PLAYERS]; //Одномерный массив для 1000 игроков.
CrmpPlayers[playerid]; //ссылаемся на ячейку игрока.

Двумерный массив:

new CrmpMassive[3][2] = {
{121,122},
{123,124},
{125,126}
};// Двумерный массив целочисленного типа. Как вы могли догадаться, при объявлении массива - первая цифра количество строк, вторая цифра количество столбцов.

CrmpMassive[1][1] = 11; //Начиная от нуля, присвоим ячейке со значением 124 - новое значение 11.
Массив Enum:

Массив Enum - это массив переменных.
enum crmp
{
crmp,
samp
}
new pawn[crmp]; //ссылка, одномерный массив.
new pawn[MAX_PLAYERS][crmp]; //ссылка, двумерный массив.
Для обращения к массиву, мы должны сделать к нему "ссылку", создав одномерную переменную. Так мы создаём массив для всех игроков. Чтобы сделать enum индивидуально для каждого игрока - нам нужен двумерная переменная.


Константы:

Константа - величина, не меняющаяся в процессе выполнения скрипта. В Pawn константы объявляются почти так же, как и переменные, однако каждое объявление начинается со слова const:
const C_CRMP = 100;
const Float:C_CRMP = 100.21;

В константах нужно обязательно указывать значение.

Строки:

Строка - это последовательность символов.

По сути строки - это те же массивы. А поскольку символы в Pawn могут храниться (!) в целочисленных переменных, то строка - это массив целых чисел. 
Инициализация строки (задание ей начального значения) обычно выполняется после её объявления:

new string[14];
string = "pawno-crmp.ru";

Рассмотрим внутреннее представление строки:

KgzJy8P.png


Обратите внимание на последний символ '\0' - это завершающий нуль-символ, обозначающий конец строки. По этому символу функция printf (и многие другие функции) определяет, на какой позиции закончить вывод символов на экран.
А теперь давайте рассмотрим строку, как массив целых чисел (коим она в Pawn и является): 

Hq64HaG.png


Каждому символу строки соответствует свой номер (код), при этом последний элемент равен нулю - это и есть завершающий нуль-символ.

Кроме нуль-символа в Pawn есть и другие специальные символы:

mINBV7P.png


Строкам, в которых меньше позиций, нельзя присваивать значения строк, в которых больше позиций. Впрочем, это ограничение можно обойти при помощи функции strcat:

strcat(<строка1>, <строка2>, <размер>);

Данная функция "прицепляет" к концу 1-й строки значение 2-й строки. С помощью неё можно безопасно скопировать значение из исходной строки в целевую, указав размер 1-й строки. При этом последний параметр (размер) - необязательный, т.е. его можно не указывать.

Функции:

Функция - обособленная последовательность действий, возвращающая определённое число значений в место вызова. 

Синтаксис:

<имя>(<параметры>)
{
<действие1>;
<действие2>;
<действие3>;
<действиеN>;
}


Любой код на Pawn состоит из функций. Это помогает избежать больших размеров кода, упростить структуру кода.

// функия sum, получает на входе целые числа a и b,
// затем складывает их и возвращает результат
sum(a, b)
{
new result = a+b; // сложить 2 числа и записать результат в result
return result; // вернуть результат сложения в место вызова
}


Функция складывает 2 числа, полученных на входе, и возвращает результат на место вызова при помощи ключевого слова return

Данная функция выводит на экран "Hi!" и не возвращает никаких значений, т.к. в конце функции нет ключевого слова return.

Внимание! Функция main является главной функцией в любом скрипте, т.к. с неё начинается выполнение кода любого скрипта.
Теперь перейдём от объявления функций к их использованию. Попробуем использовать описанную выше функцию sum из функции main для сложения двух чисел: 

sum(a, b)
{ // можно обойтись и без переменной result,
// подставив в return выражение "a+b"
return a+b;
}

main() // выполнение кода начнётся с этой функции
{
new x = 4, y = 6, z = 5;
printf("X = %d, Y = %d, Z = %d", x, y, z); // вывести значения x, y и z
new result = sum(x, y);
printf("X + Y = %d", result); // вывести результат сложения (x+y)
printf("X + Y + Z = %d", sum(result, z)); // вывести результат ((x+y)+z)
}


Как и говорилось выше, функция main всегда самая главная, а потому выполнение кода начнётся именно с неё. Переменной result будет присвоено значение, которая вернёт функция sum, сложив числа x и y. Однако можно обойтись и без записи результата во временную переменную result, подставив вызов функции sum внутрь вызова функции printf, тогда значение, которое вернёт sum, тут же будет выведено на экран.
Таким образом, на экран будет выведено: 

X = 4, Y = 6, Z = 5
X + Y = 10
X + Y + Z = 15


На этом пока что всё. Материал будет дополняться, успехов.
 
Вы тоже можете дополнять данный материал.
 
Последнее редактирование модератором:

Rambler

Новичок
Пользователь
13.07.2016
1
0
0
28
У меня вот есть вопрос по поводу двухмерных массивов 

new CrmpMassive[3][2] = {
{121,122}, // Я как понимаю до знака "запятая" это идет присвоение в ячейку "0", а вот после запятой в столбец "0"
{123,124},
{125,126} // Почему тут идет присвоение в ячейку "2"(как и нужно) и в столбец "2"(как не нужно) если компилятор забирает под свои нужды данный столбец.


Объясните пожалуйста глупому, может я что-то не так понял...

 
Статус
Закрыто для дальнейших ответов.