Получить 2 значения из одной функции.
| |
tonline_kms65
|
Дата: Вторник, 21.02.2017, 16:58:39 | Сообщение # 1 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Всем привет. Может быть я туплю, не могу сообразить - реально ли получить из одной функции одновременно 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 |
|
Сообщений: 200
Репутация: 30 [ +/- ]
|
|
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 между твоей точкой и координатами сущности.
|
|
| | |
tonline_kms65
|
Дата: Среда, 22.02.2017, 03:07:54 | Сообщение # 4 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Цитата 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 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Спасибо. Вот это уже более понятно. Объявляю переменные локально, и уже в них записываю полученные из функции значения.
Код int ID_ентитьки; float POS_энтитьки[3];
запускаю функцию test(ID_ентитьки, POS_энтитьки); после выполнения этой функции она вернет значения в этих переменных.
После работы обязательно протестирую. Если это оно то у меня руки развяжутся. Получится - я не так функцию запускал. Я в шоке.
Сообщение отредактировал tonline_kms65 - Среда, 22.02.2017, 04:15:17 |
|
| |
_R1KO_
|
Дата: Среда, 22.02.2017, 15:03:25 | Сообщение # 7 |
|
Сообщений: 200
Репутация: 30 [ +/- ]
|
|
tonline_kms65, вся фишка в &. Это передача переменной по адресу, а не как обычно - по значению. При такой передаче в ф-ю передается не значение переменной, а её адрес и следовательно изменяя её значение в ф-и, значение изменяется и в том месте, откуда её вызвали. Для массивов по-умолчанию идет передача по адресу.
|
|
| |
tonline_kms65
|
Дата: Четверг, 23.02.2017, 07:03:39 | Сообщение # 8 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Да. Все четко работает. Проще и понятнее просто некуда. Еще раз - я просто в шоке!
Сколько лет обходил такие вопросы, а зря. Не понимаю - делал просто по другому. Начинали то когда комп был еще какой то 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 |
|
Сообщений: 215
Репутация: 3 [ +/- ]
|
|
Ок. Понятно. В принципе и 32 значения уже перебор.
Получился небольшой тутор для таких как я. Жаль что немного нас в игровом редактировании, все либо отошли от дел, либо где то сидят, типа 1С или подобном оптово-сладском "программировании".
|
|
| |
DoubleBigGuy
|
Дата: Четверг, 23.02.2017, 15:22:09 | Сообщение # 11 |
|
Сообщений: 30
Репутация: 1 [ +/- ]
|
|
Я на unknowncheats сижу, там все найти можно.
|
|
| |
_R1KO_
|
Дата: Четверг, 23.02.2017, 15:23:21 | Сообщение # 12 |
|
Сообщений: 200
Репутация: 30 [ +/- ]
|
|
Цитата tonline_kms65 ( ) Жаль что немного нас в игровом редактировании, все либо отошли от дел, либо где то сидят, типа 1С или подобном оптово-сладском "программировании". мне кажется даже если я найду работу программистом - без павна не смогу
|
|
| |
|