Типы переменных
| |
_wS_
|
Дата: Пятница, 13.01.2012, 22:56:10 | Сообщение # 1 |
|
Типы переменных
Переменные используются для хранения каких-то данных. Так как есть разные типы данных (числа, строки, массивы и т.д.), то и переменные есть разные. В ЭТОЙ СТАТЬЕ вы найдёте больше информации.
Код // Перечисление. // Значение первого элемента по умолчанию 0. // Значение каждого следующего элемента увеличивается на 1. // Вместо этого, можно использовать константы: #define MY_VAR_NAME1 0 enum E { E_MyVarName1, E_MyVarName2, E_MyVarName3, };
// Структуры могут содержать функции и переменные с разными типами. // Удобно хранить в StringMap и ArrayList. enum struct T { int a; int b;
int Sum() { return this.a + this.b; } }
public void OnPluginStart() { bool b = true; PrintToServer("b = %d", b); // b = 1. %d и %i одинаковы.
int d = 5; PrintToServer("d = %d (%02d)", d, d); // d = 5 (05)
float f = 2.5; PrintToServer("f = %f (%.1f)", f, f); // f = 2.500000 (2.5)
Handle h = GetMyHandle(); PrintToServer("h = %x (%X)", h, h); // h = 13000c (13000C)
char s[] = "abc"; PrintToServer("s = %s", s); // s = abc
int ar[2] = {7, 9}; PrintToServer("ar[0] = %d", ar[0]); // ar[0] = 7 PrintToServer("ar[1] = %d", ar[1]); // ar[1] = 9
// Динамический массив. // delete (как в C++) делать не нужно, т.к. память сама освободится. // Размер можно указать с помощью переменной. // Размер обычных (не динамических) массивов можно указать только КОНСТАНТАМИ. int[] dynamic_ar = new int[3]; for (int i = -1; ++i < 3;) { dynamic_ar[i] = i * 2; PrintToServer("dynamic_ar[%d] = %d", i, dynamic_ar[i]); } // dynamic_ar[0] = 0 // dynamic_ar[1] = 2 // dynamic_ar[2] = 4
PrintToServer("INVALID_HANDLE = %x", INVALID_HANDLE); // INVALID_HANDLE = 0
Handle h_null = null; PrintToServer("INVALID_HANDLE == null (%s)", INVALID_HANDLE == h_null ? "yes" : "no"); // INVALID_HANDLE == null (yes)
T t; t.a = 1; t.b = 2; PrintToServer("T::Sum() = %d", t.Sum()); // T::Sum() = 3
PrintToServer("E_MyVarName1 = %d", E_MyVarName1); // 0 PrintToServer("E_MyVarName2 = %d", E_MyVarName2); // 1 PrintToServer("E_MyVarName3 = %d", E_MyVarName3); // 2 }
Сообщение отредактировал _wS_ - Четверг, 14.03.2024, 12:30:43 |
|
| |
Scarface_slv
|
Дата: Четверг, 10.05.2012, 09:55:34 | Сообщение # 2 |
|
Сообщений: 737
Репутация: 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 |
|
Сообщений: 737
Репутация: 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
Репутация: -4 [ +/- ]
|
|
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]; 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
Репутация: -4 [ +/- ]
|
|
Преобразование типов к примеру из float в new (int). ???
|
|
| |
TEIN
|
Дата: Четверг, 09.01.2014, 16:28:22 | Сообщение # 11 |
|
Сообщений: 563
Репутация: 78 [ +/- ]
|
|
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
Репутация: -4 [ +/- ]
|
|
Как вариант. А я через цыкл и остаток от деления делал lol
|
|
| |
_wS_
|
Дата: Четверг, 09.01.2014, 17:12:42 | Сообщение # 13 |
|
API для кого
RoundToZero RoundToCeil RoundToFloor RoundToNearest RoundFloat
|
|
| |
Vitaminoz
|
Дата: Понедельник, 24.02.2014, 20:28:02 | Сообщение # 14 |
|
Сообщений: 141
Репутация: 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
|
|
| |
|