Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 212»
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Типы переменных (Float, String, Handle, bool)
Типы переменных
_wS_ Дата: Пятница, 13.01.2012, 22:56:10 | Сообщение # 1
Типы Переменных

Переменные необходимы для хранения различных данных. Так как есть разные типы данных (числа, строки, массивы и т.д.), то и переменные есть разные. Перед тем, как присвоить переменной какое-то значение, её нужно объявить (создать) с помощью ключевого слова new. Обязательно прочитайте эту статью, т.к. она поможет вам многое понять.

Если коротко, то есть такие типы переменных:

Код
new x; // 0 (целое число) | %d
new Float:x; // 0.0 (число с точкой) | %f
new bool:x; // false. Хранит значение true (правда 1) и false (ложь 0) | %d
new String:x[3] = "wS"; // строка (надо указывать её размер. но в этом случае не обязат, можно []) | %s
new Handle:x; // Уникальный идентификатор, например, 26001a | %x
new x[2]; // массив, содержащий 2 целых числа. 1 элемент: x[0], второй: x[1] | %d

Для теста:

Код
#include <sourcemod>

public OnPluginStart()
{
      new Handle:PluginHandle = GetMyHandle();
      PrintToServer("PluginHandle = %x, INVALID_HANDLE = %x", PluginHandle, INVALID_HANDLE);
      // PluginHandle = 26001a, INVALID_HANDLE = 0
}

Как узнать, какой нужно тип переменной создать?

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

Код
native Handle:CreateTimer(Float:interval, Timer:func, any:data=INVALID_HANDLE, flags=0);

Перед именем функции видно приставку 'Handle:' и ниже написано, что она возвращает: 'Handle to the timer object'. Это значит, что если мы хотим сохранить идентификатор таймера, то нужно создать Handle переменную.

Код
new Handle:xz = CreateTimer(1.0, zxFunc);

Если вы присвоете переменной не тот тип значения, то произойдёт ошибка (увидите её при компиляции).
 
Scarface_slv Дата: Четверг, 10.05.2012, 09:55:34 | Сообщение # 2
Сообщений: 749
Репутация: 61 [ +/- ]
глупый наверно вопрос но что такое static String: ... или просто static ...?
 
_wS_ Дата: Четверг, 10.05.2012, 10:27:28 | Сообщение # 3
Здесь есть статья об этом.
Если честно, я никогда не использовал его. Попозже, если пойму что оно такое, дам несколько примеров =)

Локальный static понять несложно. Вот скрипт для теста.

Code
#include <sourcemod>

public OnPluginStart()
{
     new x = 0;
     while (x < 5) PrintToServer("-> %d", func_1(++x));
}

func_1(num)
{
     static x = 0;
     x += 10;
     return x + num;
}

Результат:

Quote
-> 11
-> 22
-> 33
-> 44
-> 55

Получается, что само объявление переменной static x = 0 происходит только 1 раз и её значение сохраняется.
Доступна только внутри текущей функции.
Видимо это иногда полезно, чтобы не надо было создавать лишние глобальные переменные.
 
Scarface_slv Дата: Четверг, 10.05.2012, 21:34:16 | Сообщение # 4
Сообщений: 749
Репутация: 61 [ +/- ]
Спасибо))

Добавлено (10.05.2012, 21:34:16)
---------------------------------------------
как сбросить на 0 глобальный static decl: ... ну чтоб удалилась строка вообщем

 
_wS_ Дата: Четверг, 10.05.2012, 21:46:49 | Сообщение # 5
Наверно ж как и здесь x сбросили (изменили), так и со строкой:

Code
#include <sourcemod>

static x = 0;

public OnPluginStart()
{
     while (x < 5) PrintToServer("-> %d", ++x);
     x = 5;
     while (x > 1) PrintToServer("-> %d", --x);
}

Quote
-> 1
-> 2
-> 3
-> 4
-> 5
-> 4
-> 3
-> 2
-> 1

С помощью Format пробуй или просто x = "текст";
 
Naykon Дата: Понедельник, 30.12.2013, 12:14:01 | Сообщение # 6
Сообщений: 439
Репутация: -5 [ +/- ]
decl

Код
decl a; // Если переменной такого типа не присвоить значение то она будит содержать "мусор" (Мусор - случайные значения которыми занята память)
new b; // Объявление такого типа переменной в отличие от decl будит содержать по умолчанию число 0 (NULL).

В переменной decl не вижу реальной пользы.. как она влияет на скорость работы? или она как-то экономит память?...   

Опасность использования decl.
decl String:array[124]; //Если попытаться вывести этот массив сразу на экран то точки остановы в нем не будит ("\0"). т.к подобный мессив засран "мусором", сервер упадет. (Последняя ячейка массива должна содержать \0.


Никогда не пользовался decl, при создании сообщения руководствовался литературой SourcePawn. Верно ли мое утверждение? И укажите плюсы decl.

Добавлено (30.12.2013, 12:08:45)
---------------------------------------------

Код
Глобальный static
Глобальные static переменные могут быть доступны только в рамках того же файла. Например:
//file1.inc
static Float:g_value1 = 0.15f;
   
//file2.inc
static Float:g_value2 = 0.15f;
Если плагин включает в себя оба этих файла, он не сможет использовать g_value1 или g_value2. Это простой механизм сокрытия информации, и аналогичен элементам объявления переменных, например private в таких языках, как C++, Java, или C#.


Вот тут распишите поподробней, и пример пожплуйста. private - в c++ встречал только в class'ах... тут классов нет.

Добавлено (30.12.2013, 12:14:01)
---------------------------------------------
Если прям грубо то..

Код
new x[2]; // массив, содержащий 2 целых числа. 1 элемент: x[0], второй: x[1] | %d, x[2] = \0 - так, но к ней нельзя обратиться.


Сообщение отредактировал Naykon - Понедельник, 30.12.2013, 11:58:55
 
BeatMaker_R1KO_ Дата: Понедельник, 30.12.2013, 19:30:03 | Сообщение # 7
Сообщений: 60
Репутация: 0 [ +/- ]
Код
new x[2];

если я хочу обеим присвоить значение то это делать так?
Код
new x[2];
x = {27, 34};


?
 
_wS_ Дата: Понедельник, 30.12.2013, 21:54:08 | Сообщение # 8
Работает же, значит можно и так.
 
_wS_ Дата: Понедельник, 30.12.2013, 23:34:13 | Сообщение # 9
Naykon:

1. decl - полезно использовать, если объявляешь массив, не знаешь что еще в нем будет и сейчас будешь его заполнять, тем более если эта часть кода выполняется часто.

2. Глобальный static - ты сам ответил на свой вопрос, static x = 1; - переменная x глобальная, но лишь в том файле, в котором она объявлена (хм, я не использовал это). Если используешь static внутри функции, то только внутри этой функции она и доступна.
 
Naykon Дата: Среда, 08.01.2014, 22:10:37 | Сообщение # 10
Сообщений: 439
Репутация: -5 [ +/- ]
Преобразование типов к примеру из float в new (int). ???
 
TEIN Дата: Четверг, 09.01.2014, 16:28:22 | Сообщение # 11
Сообщений: 551
Репутация: 73 [ +/- ]
new Float:float_num = 2.5;

decl String:buffer[50];
FloatToString(float_num, buffer, sizeof(buffer));

new int_num = StringToInt(buffer);
 
Naykon Дата: Четверг, 09.01.2014, 17:02:32 | Сообщение # 12
Сообщений: 439
Репутация: -5 [ +/- ]
Как вариант. А я через цыкл и остаток от деления делал lol
 
_wS_ Дата: Четверг, 09.01.2014, 17:12:42 | Сообщение # 13
API для кого

RoundToZero
RoundToCeil
RoundToFloor
RoundToNearest
RoundFloat
 
Vitaminoz Дата: Понедельник, 24.02.2014, 20:28:02 | Сообщение # 14
Сообщений: 139
Репутация: 1 [ +/- ]
Есть переменная в 1 файле .sp, каким образом мне её использовать во втором файле .sp ?
 
_wS_ Дата: Понедельник, 24.02.2014, 21:05:03 | Сообщение # 15
Цитата Vitaminoz ()
Есть переменная в 1 файле .sp, каким образом мне её использовать во втором файле .sp ?


Код
new x = 1;
#include "adminmenu/dynamicmenu.sp" // в dynamicmenu.sp можно использовать x
 
Форум » SourceMod - Counter Strike Source && CS GO » Уроки SourceMod (SourcePawn) Скриптинга » Типы переменных (Float, String, Handle, bool)
Страница 1 из 212»
Поиск: