PDA

Просмотр полной версии : [Вопрос] Сортировка двумерного массива



Иван Бубнов
15.02.2017, 11:41
Привет.

Допустим есть двумерный массив:



#define MAX_ATM 20

enum aInfo
{
aID,
Float:aPos_x,
Float:aPos_y,
Float:aPos_z
};
new BankInfo[MAX_ATM][aInfo];

Теперь нужно узнать самый ближайший банкомат к игроку. Координаты банкомата загружается в отдельном паблике, и хранится через MySQL плагин от BlueG (мб через запрос сортировать? Но затратно).

Попробовал использовать Bubble Sort (http://pro-pawn.ru/showthread.php?6836-s-%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D1%8B-%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B8), не помогло

qwezert
15.02.2017, 11:56
и хранится через MySQL плагин от BlueG (мб через запрос сортировать? Но затратно).

ВАТ? Сортировка в sql запросе работает на порядок быстрее чем ты будешь прогонять массивы. Только зачем тебе это? есть же функция которая проверяет расстояние между координатами, используй его прогоняя массив с банкоматами и будет тебе счастье

Иван Бубнов
15.02.2017, 12:11
ВАТ? Сортировка в sql запросе работает на порядок быстрее чем ты будешь прогонять массивы. Только зачем тебе это? есть же функция которая проверяет расстояние между координатами, используй его прогоняя массив с банкоматами и будет тебе счастье

Название функции? Будет не фи, если игрок пофлудит с запросами

$continue$
15.02.2017, 15:31
Сортировка в MySQL реализована на каком нибудь x языке - оно работает быстрей, чем написанное на Pawn, но тут проблема в другом, что на счет пинга?

ВАТ? Сортировка в sql запросе работает на порядок быстрее чем ты будешь прогонять массивы. Только зачем тебе это? есть же функция которая проверяет расстояние между координатами, используй его прогоняя массив с банкоматами и будет тебе счастье

vovandolg
15.02.2017, 15:33
зачем ты запросами флудишь?
вызвал разок в начале, записал все координаты в массиве и прогнал циклом все банкоматы.

Alpano
15.02.2017, 15:52
Сортировка в MySQL реализована на каком нибудь x языке - оно работает быстрей, чем написанное на Pawn, но тут проблема в другом, что на счет пинга?
используем для сортировки SQLite - profit. Пинг - 0.

Иван Бубнов
15.02.2017, 16:35
зачем ты запросами флудишь?
вызвал разок в начале, записал все координаты в массиве и прогнал циклом все банкоматы.

Потому что GetPlayerPos всегда выдает разные значения, то есть игроку достаточно ввести пару раз какую нибудь команду для поиска ближайшего банкомата, и сервер упадет (наверно)

DeimoS
15.02.2017, 19:14
Потому что GetPlayerPos всегда выдает разные значения, то есть игроку достаточно ввести пару раз какую нибудь команду для поиска ближайшего банкомата, и сервер упадет (наверно)

На дворе 21 век. Хватит держать сервера на калькуляторах.
Да и для кого антифлуд придумали? 3 строки прописать сложно?

vovandolg
15.02.2017, 20:49
Потому что GetPlayerPos всегда выдает разные значения, то есть игроку достаточно ввести пару раз какую нибудь команду для поиска ближайшего банкомата, и сервер упадет (наверно)

При чём тут GetPlayerPos если ты спросил про запросы мускула))



Теперь нужно узнать самый ближайший банкомат к игроку. Координаты банкомата загружается в отдельном паблике, и хранится через MySQL плагин от BlueG (мб через запрос сортировать? Но затратно).


Я и ответил что сразу выгрузи с базы все данные и потом уже делай проверки всякие на то какой банкомат рядом и стоят ли они вообще рядом))

StevenH
15.02.2017, 21:14
Вот как на моем сервере это реализовано (+250 онлайн), и все прекрасно работает!



case ...:
{
new min_id;
new Float:min_distance = 99999.0;

for(new b; b <= TOTAL_BUSINESS; b++) // Мой цикл на бизнесы
{
new Float:distance = GetPlayerDistanceFromPoint(playerid, BusinessInfo[b][bEnterX], BusinessInfo[b][bEnterY], BusinessInfo[b][bEnterZ]);
if (distance < min_distance)
{
min_distance = distance;
min_id = b;
}
}
SetPlayerCheckpoint(playerid, BusinessInfo[min_id][bEnterX], BusinessInfo[min_id][bEnterY], BusinessInfo[min_id][bEnterZ], 6.0);
new string[112];
format(string, sizeof(string), "На карте отмечен ближайший бизнес - {FF9900}%s{FFFFFF}. Расстояние {FF9900}%0.2f м.", BusinessInfo[min_id][bName], min_distance);
SendClientMessage(playerid, -1, string);
return true;
}

vovandolg
15.02.2017, 21:24
Вот как на моем сервере это реализовано (+250 онлайн), и все прекрасно работает!



case ...:
{
new min_id;
new Float:min_distance = 99999.0;

for(new b; b <= TOTAL_BUSINESS; b++) // Мой цикл на бизнесы
{
new Float:distance = GetPlayerDistanceFromPoint(playerid, BusinessInfo[b][bEnterX], BusinessInfo[b][bEnterY], BusinessInfo[b][bEnterZ]);
if (distance < min_distance)
{
min_distance = distance;
min_id = b;
}
}
SetPlayerCheckpoint(playerid, BusinessInfo[min_id][bEnterX], BusinessInfo[min_id][bEnterY], BusinessInfo[min_id][bEnterZ], 6.0);
new string[112];
format(string, sizeof(string), "На карте отмечен ближайший бизнес - {FF9900}%s{FFFFFF}. Расстояние {FF9900}%0.2f м.", BusinessInfo[min_id][bName], min_distance);
SendClientMessage(playerid, -1, string);
return true;
}


Честно сказать можно было и по легче код сделать))
Целый вызов не нужного мусора))

даже РЛСницы лучше написаны по этой части кода:rofl: