Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

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

  • Страница 1 из 2
  • 1
  • 2
  • »
Типы переменных
_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];

если я хочу обеим присвоить значение то это делать так?
Код
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
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: