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

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

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Получить 2 значения из одной функции.
Получить 2 значения из одной функции.
tonline_kms65 Дата: Вторник, 21.02.2017, 16:58:39 | Сообщение # 1
Сообщений: 183
Репутация: 2 [ +/- ]
Всем привет.
Может быть я туплю, не могу сообразить - реально ли получить из одной функции одновременно 2 разных значения, например float и integer.
Вернее как их получить при вызове этой функции?

Например:
Здесь я получаю позицию - pos = GetRendomEntAimPos(ent, pos); pos[3] - это флоат значение.

1. В самой функции GetRendomEntAimPos я могу получить как позицию(pos) так и ID энтити находящейся в этой позиции. А как передать, вернее при вызове эти данные получить из самой функции?
2. Или может пойти более простым путем - если в позиции (pos) есть какая то ENT, как получить её ID? Это уже не в функции. Как по возможности более просто получить ID.
Как то сумбурно я этот вопрос задал - но надеюсь понятно.


Сообщение отредактировал tonline_kms65 - Вторник, 21.02.2017, 17:14:30
 
_R1KO_ Дата: Вторник, 21.02.2017, 18:42:18 | Сообщение # 2
Сообщений: 188
Репутация: 28 [ +/- ]
tonline_kms65,
Код

int i, float f, float fArr[3];
MyFunc(i, f, fArr[3]);

void MyFunc(int &iValue, float &fValue, float fArray[3])
{
    iValue = 15;
    fValue = 4.3;
    fArray[0] = GetRandomFloat(1.0, 10.0);
    fArray[1] = GetRandomFloat(1.0, 10.0);
    fArray[2] = GetRandomFloat(1.0, 10.0);
}


1. Ты можешь получить сущность на которую наведен прицел: https://sm.alliedmods.net/api/index.php?fastload=show&id=50& (only_clients=false)
2. Цикл по всем сущностям. (+можно по класснейму фильтровать) получаешь координаты каждой и проверяешь GetVectorDistance между твоей точкой и координатами сущности.
 
Entity Дата: Среда, 22.02.2017, 01:11:04 | Сообщение # 3
Сообщений: 50
Репутация: 2 [ +/- ]
tonline_kms65, прочти ЛС prikol


Сообщение отредактировал Entity - Среда, 22.02.2017, 01:11:54
 
tonline_kms65 Дата: Среда, 22.02.2017, 03:07:54 | Сообщение # 4
Сообщений: 183
Репутация: 2 [ +/- ]
Цитата Entity ()
прочти ЛС

Я не вижу где на этом сайте лички. Почему то у меня нет этого.

Цитата _R1KO_ ()

Код
int i, float f, float fArr[3];
MyFunc(i, f, fArr[3]);

void MyFunc(int &iValue, float &fValue, float fArray[3])
{
    iValue = 15;
    fValue = 4.3;
    fArray[0] = GetRandomFloat(1.0, 10.0);
    fArray[1] = GetRandomFloat(1.0, 10.0);
    fArray[2] = GetRandomFloat(1.0, 10.0);

}


Смотри, я вызываю функцию MyFunc(i, f, fArr[3]); Здесь 3 значения. Вот они то мне и нужны.
Например я хочу получить значение интегер - i = MyFunc(i, f, fArr[3]); получил i = 15;
А как остальные получить? Там же остались еще значения которые мне нужны, например fValue = 4.3, массив fArray. Мне нужно их получить одновременно, с одного запуска MyFunc.
Или их передать в глобал? Но это уже явно не то пальто.

Вот в чем суть моего вопроса. Хотя может и не совсем так. Наверно я сам вопрос не правильно формулирую. Но уже ближе.

Добавлено (22.02.2017, 03:07:54)
---------------------------------------------
Цитата _R1KO_ ()
1. Ты можешь получить сущность на которую наведен прицел: https://sm.alliedmods.net/api/index.php?fastload=show&id=50& (only_clients=false)


Это на клиента.
У меня прицел от ENT, т.е я делаю трассировку, и уже по итогам этой трасировки получаю в прицеле позицию ENT и его ID (если ENT там есть конечно) Вот здесь я и туплю - ID это число, позиция это флоат. То-есть я сейчас (в силу своей тугоумости) могу получить или целое число или число с точкой. А мне нужны сразу оба значения. Как то так.
Можно конечно сделать проще - этот код не делать отдельной функцией, но я хочу добить это мое незнание, и получить именно из вызываемой функции все значения, которые только можно получить. С одного вызова этой функции. Это чтобы эту функцию можно было еще где нибудь использовать.


Сообщение отредактировал tonline_kms65 - Среда, 22.02.2017, 03:29:15
 
_wS_ Дата: Среда, 22.02.2017, 03:31:13 | Сообщение # 5
Цитата tonline_kms65 ()
А как остальные получить?
Там же остались еще значения которые мне нужны, например fValue = 4.3, массив fArray.
Мне нужно их получить одновременно, с одного запуска MyFunc.
Или их передать в глобал?
Но это уже явно не то пальто.


Код
public OnPluginStart()
{
   new a = 1;
   new b[2] = {2, 5};
   new String:s[] = "enot";
   new Float:f = 1.1;

   test(a, b, s, sizeof(s), f);

   PrintToServer("a = %d", a);
   PrintToServer("b[0] = %d | b[1] = %d", b[0], b[1]);
   PrintToServer("s = %s", s);
   PrintToServer("f = %.1f", f);
}

test (&FirstArgumentA, array[], String:MyStringS[], MyStringSLength, &Float:f)
{
   FirstArgumentA += 4;
   array[0] = 3;
   array[1] = 4;
   strcopy(MyStringS, MyStringSLength, "kot");
   f = 1.5;
}

// a = 5
// b[0] = 3 | b[1] = 4
// s = kot
// f = 1.5
 
tonline_kms65 Дата: Среда, 22.02.2017, 04:11:59 | Сообщение # 6
Сообщений: 183
Репутация: 2 [ +/- ]
Цитата
_wS_,


Спасибо.
Вот это уже более понятно. Объявляю переменные локально, и уже в них записываю полученные из функции значения.

Код
   int ID_ентитьки;
   float POS_энтитьки[3];

запускаю функцию  test(ID_ентитьки, POS_энтитьки);  
после выполнения этой функции она вернет значения в этих переменных.


После работы обязательно протестирую. Если это оно то у меня руки развяжутся.
Получится - я не так функцию запускал. Я в шоке.


Сообщение отредактировал tonline_kms65 - Среда, 22.02.2017, 04:15:17
 
_R1KO_ Дата: Среда, 22.02.2017, 15:03:25 | Сообщение # 7
Сообщений: 188
Репутация: 28 [ +/- ]
tonline_kms65, вся фишка в &. Это передача переменной по адресу, а не как обычно - по значению. При такой передаче в ф-ю передается не значение переменной, а её адрес и следовательно изменяя её значение в ф-и, значение изменяется и в том месте, откуда её вызвали.
Для массивов по-умолчанию идет передача по адресу.
 
tonline_kms65 Дата: Четверг, 23.02.2017, 07:03:39 | Сообщение # 8
Сообщений: 183
Репутация: 2 [ +/- ]
Да. Все четко работает. Проще и понятнее просто некуда. Еще раз - я просто в шоке!

Сколько лет обходил такие вопросы, а зря. Не понимаю - делал просто по другому. Начинали то когда комп был еще какой то 378, потом 478 по моему. 1964-1995 года. Тогда инета в помине не было. Переводчиков тоже. Догадывались до всего сами, своими мозгами. Так и всё и осталось, в мозгах закрепилось. У меня первым языком был бейсик.
Поэтому нужно больше спрашивать советов.
Так что всем огромное спасибо за подсказку.
Да, кстати, а мах. сколько можно значений получать из функции?
 
_wS_ Дата: Четверг, 23.02.2017, 07:12:47 | Сообщение # 9
Цитата tonline_kms65 ()
Да, кстати, а мах. сколько можно значений получать из функции?

https://wiki.alliedmods.net/Introduction_to_SourcePawn_1.7#Functions
Сначала сказали "функция может иметь любое количество параметров", а дальше "есть разумный предел 32 в SourceMod".
Если функция ломается из-за большого кол-ва аргументов, то толкай инфу в KeyValues/Array/Массивы и проч.
 
tonline_kms65 Дата: Четверг, 23.02.2017, 10:38:54 | Сообщение # 10
Сообщений: 183
Репутация: 2 [ +/- ]
Ок. Понятно.
В принципе и 32 значения уже перебор.

Получился небольшой тутор для таких как я. Жаль что немного нас в игровом редактировании, все либо отошли от дел, либо где то сидят, типа 1С или подобном оптово-сладском "программировании".
 
DoubleBigGuy Дата: Четверг, 23.02.2017, 15:22:09 | Сообщение # 11
Сообщений: 25
Репутация: 1 [ +/- ]
Я на unknowncheats сижу, там все найти можно.
 
_R1KO_ Дата: Четверг, 23.02.2017, 15:23:21 | Сообщение # 12
Сообщений: 188
Репутация: 28 [ +/- ]
Цитата tonline_kms65 ()
Жаль что немного нас в игровом редактировании, все либо отошли от дел, либо где то сидят, типа 1С или подобном оптово-сладском "программировании".

мне кажется даже если я найду работу программистом - без павна не смогу
 
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Получить 2 значения из одной функции.
Страница 1 из 11
Поиск: