Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Переменные, Массивы, Enum - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Переменные, Массивы, Enum
Оценка: -----

#1
Пользователь офлайн   Romzes 

  • © Pawn-Wiki.Ru
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Здравствуйте читатели форума pawn-wiki.ru, я приветствую вас в этой теме с обновленным уроком по переменным, массивам и enum'ам.

Надеюсь, прочитав этот урок, вы найдете для себя много нового ;). Давайте начнем с простого.

Переменные и как ими пользоватся

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

различные данные для их последующего вызова. Тоесть действия с переменными предельно просты: запись информации,вывод и

использование информации. Если присмотрется ближе, то список можно пополнить еще одним пунктом - объявление переменной.

Каждая переменная имеет свое название, чтобы компилятор мог отличить друг от друга переменные, название мы задаем при

объявлении. Оператор объявления переменной - new. Вот пример объявления новой переменной:

new MyFirstVariable;



Тут мы объявили переменную и назвали ее MyFirstVariable (моя первая переменная). Название могут быть, естественно, разные,

но помните, что павн не поддерживает кириллицу (это вам не 1с)! Перейдем к следующему пункту - запись информации. Запись

информации осуществляется с помощью оператора присвоения или различных функций. Рассмотрим оператор присвоения:

MyFirstVariable = 3;



Таким образом мы присвоили предварительно созданной переменной значение 3. Ни в коем случае не путайте оператор присвоения(

= ) с оператором сравнения ( == ). Вот пример оператора объявления и оператора присвоения соединенных вместе:

new MySecondVariable = 3;



Тоесть переменная будет равна трем изначально.

Из пункта запись информации вытекает пункт - изменение информации. Изменять информацию мы можем как с помощью оператора

присвоения,так и с помощью специальных операторов, список приведен ниже.

//+= - оператор прибавления числа, выглядит так:

Variable += 3;// прибавляем к текущему значению переменной 3

//-= - оператор отнятия числа от текущего значения переменной, выглядит так:

Variable -= 3;// отнимаем от текущего значения переменной 3

//++ - оператор инкримента или прибавления числа один, выглядит так:

Variable++;// прибавляем к текущему значению переменной 1

//-- - оператор декримента или отнятия числа один, выглядит так:

Variable--;// отнимаем от текущего значения переменной 1



И естественно использование информации. Переменные фактически действуют как дефайны и в нужный момент и в нужном месте

"преобразовываются" в значения которые записаны в переменной. Вот несколько примеров:


new variable = 3;

if(variable == 3)//пример в условии
{
   GivePlayerWeapon(playerid,variable,3);//пример с playerid и variable, playerid ведь тоже переменная
}




Ну думаю тут все легко и понятно. Так же хотелось бы разъяснить ситуацию с локальными переменными, поясню: переменные

объявленные в самом начале мода или не в пабликах/функциях (т.е не состоящие в фигурных скобках) называются глобальными (т.е

действуют абсолютно во всем моде), а состоящие в скобках - локальными. Локальные переменные дейсвуют во всех скобках

открытых после нее и "самоуничтожается" когда исполнение кода дойдет до закрытия скобок. Пример:

new Global;//глобальная переменная

public OnGameModeInit()
{  
   new Local;//локальная переменная
   if(!local)
   {
      new DeepLocal;//локальная переменная "ниже уровнем"
   }	
}



Теперь надо разобратся с типами переменных, точнее с тегами. Тегами называются сочетания букв и цифр отделенные от

переменной двоеточием, они определяют тип данных в переменной. Известные нам теги:

bool,Float,Text,3DText,Player3DText и так далее



Теги типа - DB, DBResult я писать не стал, т.к для их использования требуется отдельный инклуд.

Как я уже говорил, теги определяют тип данных в переменной, вот основные типы которые вам понадобятся:

Integer - целочисленный тип или целое число, стандартный тип в павн, тег не требуется. (примеры: 3, -23, 2032)

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

здоровья/координат. (примеры: -3.321, 7.213, 213.3)

Bool - логический тип или boolean или ложь/правда, может иметь только два значения ложь и правда (true или false, по 

аналогии это 1 и 0, хотя числа использовать нельзя). (примеров не даю, все и так понятно)



Вот примеры работы с тегами в коде:

new IntVariable = 33;//переменная с типом integer
new Float:FltVariable = 56.213;//переменная с типом Float
new bool:TrueFalse = true;//переменная логического типа



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

new Variable = 'a';



Эта переменная будет носить значение буквы a. На данной стадии для нас это бесполезно, хотя потом пригодится. Внимание:

буквы разного регистра считаются РАЗНЫМИ!

Массивы

Для того, чтобы представить, что такое массивы, нам надо представить таблицу, в которой есть строки и столбцы. Массивы

бывают двух видов - одномерные и двумерные (есть еще тремерные (не знаю как пишется, правда), но извращатся с ними не стоит)

, теперь вернулись к нашей мысленной табличке и представили, что у нас есть 1 строка и некоторое кол-во столбцов в которые

записываются данные (цифра или буква или другие данные (зависит от тега)) - это одномерный массив, а теперь подключим еще и

строки, это уже будет двумерный массив. Примеры:

new MyFirstMassive[12];//это одномерный массив с 12 "столбцами"

new MySecondMassive[2][5];//это двумерный массив с 2 "столбцами" и 5 "строками", т.е получается 10 слотов для хранения 

данных, если угодно - полей

MyFirstMassive[0] = 3;//мы присвоили первому элементу массива ("поля" называются элементами, членами и тд)

MySecondMassive[1][3] = 4;//мы присвоили 1 "столбцу" и 3 "строке" и сответственно какому-то "полю" т.е члену или элементу 

массива значение 4.



Следует помнить, что при указании размера массива указывается общее число элементов, а поскольку отсчет в любом языке

скриптинга идет с 0, то цифра указанная как размер массива в операциях с массивом использоватся не может (максимальная цифра

будет: размер массива - 1).

Также следует знать оператор который определяет размер массива и называется он sizeof, примеры:


new Massive[5];

if(sizeof(Massive) == 5) return print("sizeof of massive = 5");

//а вот если массив двумерный и надо узнать "второй" размер, то поступаем так

new MassiveTwo[4][5];

if(sizeof(MassiveTwo[]) == 5) return print("second sizeof of massive = 5");




С тегами и типами данных то же самое, что и в переменных.


new Float:floatmassive;




Все члены массива будут носить данные вещественного типа.

Так же существует еще один прием с массивами


new Massive[5] = 43;//все члены массива изначально будут равны 43




Теперь перейдем к строкам. В некоторых языках скриптинга есть отдельный тип для этого, string или строковый, в павн это

реализовано немного по другому. Для начало, что такое строки или строковый тип данных (которого в павн нет), это переменные

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

буквы/знака или цифры как символа (смысла в этом нет, если это просто переменная), а вот если у нас массив, то каждому

элементу массива можно задать определенный символ и при выводе всего массива вместе, то получится текст. Все предельно

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


new StringMassive[128];//как размер укажем максимальное кол-во символов

StringMassive = "Hello World!";//скобки не одинарные, при присвоении массиву строкого значения скобки должны быть двойными

new StringMassiveTwo[128] = "Hello World! vol.2";//также можно присвоить строковое значению массиву прямо при присвоении

StringMassiveTwo[0] = 0;//таким образом можно обнулить строку.



И в конце этой "главы" рассмотрим присвоение значений массивам при обьявлении (каждому элементу)


//Если массив одномерный

new Massive[3] = { //оператор присвоение и открытие фигурной скобки
2,3,5//через запятую перечисляем значения
};//закрытие скобки и точка с запятой

//если массив двумерный

new MassiveTwo[3][5] = {
{1,2,3,4,5},//каждый "столбец" обозначается отдельными фигурными скобками, отделяются каждые скобки запятыми
{6,7,8,9,10},
{11,12,13,14,15}
};

//если мы имеем дело со строками

new StringMassive[3][128] = {"fsdfafs","fdsagas","fdsgsd"};//важно помнить, что нам надо выделить элементы еще и под буквами




С тегами все абсолютно тоже самое, только с тегами ;)

Enum'ы

А теперь заключительная часть урока, енумы. Енумы на самом деле очень полезная вещь, она позволяет определить структуру

массива, зачем это надо я сейчас обьясню. Например: у нас есть один массив, в котором мы хотим видеть несколько типов

данных, например логический чередуется с целочисленным и завершается все это строкой которая нам совершенно не нужна до

этого. Но как же это реализовать? Мы будем использовать енумы.

enum MyEnum //сначала идет оператор enum и через пробел название енума
{//открытие фигурной скобки
   IntType,//через запятую члены будущего массива, именно так задается структура будущего массива
   bool:Boolean,
   string[128]//и венчает все это массив о котором мы говорили
};//закрытие фигурной скобки и точка с запятой

//итак структура определена, теперь делаем массив

new EnumMassive[MyEnum];//название енума или, если угодно, структуры суем туда где должен был быть размер

EnumMassive[IntType] = 3;//целочисленный тип

EnumMassive[Boolean] = true;//логический тип

EnumMassive[string] = "Hello World! vol.3";//и массив

EnumMassive[string][4] = 'o';//вот так будет выглядеть массив

//так же можно присвоить значение члену структуры прямо в енуме, думаю понятно как это работает



Ну вот и весь урок.

Урок написан REALman'ом. Версия 2.0, отредактировано 18.06.2011.

Сообщение отредактировал Mike: 18 Январь 2012 - 16:41

2

Сказали спасибо 1 :
Neshta 

#2
Пользователь офлайн   Den_Fuck 

  • Пользователь
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Круто терь чонить то понимаю
0

#3
Пользователь офлайн   Rock & Roll 

  • Снова в деле?
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Если про переменные начал, то расскажи и про PVar's
0

#4
Пользователь офлайн   Humphrey 

  • Новичок
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
У меня есть массив
new atmpos[18][3]; //18 терминалов с 3 координатами для каждого



И мне нужно на каждый повесить 3D текст:
Правильно так:
for(new ctp=1; ctp<18; ctp++) { Create3DTextLabel("Банковский терминал\nВведите /atm, чтобы использовать", Yellow, atmpos[ctp][0], atmpos[ctp][1], atmpos[ctp][2], 7, 0, 0); }
Или так:
for(new ctp; ctp<17; ctp++) { Create3DTextLabel("Банковский терминал\nВведите /atm, чтобы использовать", Yellow, atmpos[ctp][0], atmpos[ctp][1], atmpos[ctp][2], 7, 0, 0); }



Посути вопрос такой:
В двухмерном массиве колонки начинаются с 0.
А строки с 0 или 1???
0

#5
Пользователь офлайн   Tonys 

  • Прохожий
  • Вставить ник
  • Цитировать
  • Раскрыть информацию
Более подробно всё! Спасибо!

Спасибо за урок!
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей

  1. Google