Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для SnyXes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.05.2016
    Сообщений
    11
    Репутация:
    5 ±

    sscanf разбор строки

    sscanf(s_friends, "p<,>a<s[24]>[25]", pFriendNick[playerid]);

    Хочу через sscanf разобрать строку в массив, но этот код не работает (массив пустой после разбора).

    Вот строка которую надо разобрать: ",,,,,,,,,,,,,,,,,,,,,,,,". В этой строке ники друзей разделены запятыми (пока что пусто потому что нет друзей, если добавить например 3-4 друга, строка выглядела бы так: "Друг1,Друг2,Друг3,,,,,,,,,,,,,,,,,,,,,,"). Ну здесь думаю все понятно, перейдем к самому массиву в который нужно записать ники друзей.

    Массив глобальный.
    new pFriendNick[MAX_PLAYERS][MAX_FRIENDS][MAX_PLAYER_NAME];
    Где MAX_PLAYERS - 1000, MAX_FRIENDS - 25, MAX_PLAYER_NAME - 24;

    P.S. Я чувствую что проблема в s[24], потому что с целочисленными значениями все работает на ура!
    Вот так разбираю целочисленные значения:
    sscanf(s_weapons, "p<,>a<i>[20]", PlayerInfo[playerid][pWeapon]);

    P.P.S. Я все перепроверил. Я уверен, что строковая переменная которую я разделяю не пустая и т.д.

  2. #2
    Аватар для Seviel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±
    Простите что не по теме, но по мне легче сделать отдельную таблицу(ну или файл) в котором будут хранится связи, с двумя столбцами в одном будут хранится имя(ну или id) того у кого ищешь друзей, а второй имя друга. и когда надо SQL запросом(например для sql SELECT `friend` FROM `friends` WHERE `user`='Player', а на файлах не знаю) выводишь выборку. Как по мне меньше мороки.

  3. Пользователь сказал cпасибо:
    qwezert (26.01.2017)
  4. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    В sscanf, похоже, передаётся ссылка на всю переменную, а не на ячейку в массиве, поэтому такая ерунда и происходит.
    Может быть есть варианты получше, но я могу предложить что-то вроде этого:
    PHP код:
    new temp[MAX_FRIENDS][MAX_PLAYER_NAME];
    sscanf(s_friends"p<,>a<s[24]>[25]"temp);
    pFriendNick[playerid] = temp
    P.S. Рекомендую константные значения в sscanf записывать таким образом:
    PHP код:
    "p<,>a<s[" #MAX_PLAYER_NAME "]>[" #MAX_FRIENDS "]" 
    Последний раз редактировалось ziggi; 26.01.2017 в 01:19.

  5. 4 пользователя(ей) сказали cпасибо:
    Nash_Brigers (26.01.2017) qwezert (26.01.2017) Seviel (27.01.2017) SnyXes (26.01.2017)
  6. #4
    Аватар для SnyXes
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.05.2016
    Сообщений
    11
    Репутация:
    5 ±
    Спасибо, придется использовать такой обход.)
    Странно... ведь с целочисленным двумерным массивом все работает нормально, может быть sscanf не работает с трехмерными массивами. Проверю как нибудь.)

    - - - Добавлено - - -

    Цитата Сообщение от Seviel Посмотреть сообщение
    Простите что не по теме, но по мне легче сделать отдельную таблицу(ну или файл) в котором будут хранится связи, с двумя столбцами в одном будут хранится имя(ну или id) того у кого ищешь друзей, а второй имя друга. и когда надо SQL запросом(например для sql SELECT `friend` FROM `friends` WHERE `user`='Player', а на файлах не знаю) выводишь выборку. Как по мне меньше мороки.
    Тогда в этой таблице кол-во строк может дойти до 3 000 000 строк (если 100.000 аккаунтов зарегистрировано и у них всех по 25 друзей, я уже не говорю про запросы в друзья (входящие и исходящие, в них тоже макс. запросов 25), получается уже не 3 000 000, а 9 000 000).
    Работать с таким огромным кол-вом строк не оптимизированно я считаю. Большая нагрузка на MySQL сервер, да и вообще если вдруг мне понадобится вручную удалить какого-нибудь друга, я могу запросто это сделать изменив всего лишь одну ячейку в БД.

    Так же есть вариант в каждой строке 25 ячеек для каждого друга создать, но это тоже не вариант поскольку на сервере придется считывать значения из каждой ячейки, что тоже влияет на нагрузку MySQL сервера.
    Последний раз редактировалось SnyXes; 26.01.2017 в 13:27.

  7. #5
    Аватар для qwezert
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.06.2016
    Адрес
    Одесса, Украина
    Сообщений
    281
    Репутация:
    51 ±
    Цитата Сообщение от SnyXes Посмотреть сообщение
    Спасибо, придется использовать такой обход.)
    Странно... ведь с целочисленным двумерным массивом все работает нормально, может быть sscanf не работает с трехмерными массивами. Проверю как нибудь.)

    - - - Добавлено - - -



    Тогда в этой таблице кол-во строк может дойти до 3 000 000 строк (если 100.000 аккаунтов зарегистрировано и у них всех по 25 друзей, я уже не говорю про запросы в друзья (входящие и исходящие, в них тоже макс. запросов 25), получается уже не 3 000 000, а 9 000 000).
    Работать с таким огромным кол-вом строк не оптимизированно я считаю. Большая нагрузка на MySQL сервер, да и вообще если вдруг мне понадобится вручную удалить какого-нибудь друга, я могу запросто это сделать изменив всего лишь одну ячейку в БД.

    Так же есть вариант в каждой строке 25 ячеек для каждого друга создать, но это тоже не вариант поскольку на сервере придется считывать значения из каждой ячейки, что тоже влияет на нагрузку MySQL сервера.
    Что то ты написал слишком замудрено. В бд можно спокойно создать связь 1 ко многим или многие ко многим и свзяывать столько id игроков между собой - сколько влезет и ненужно никаких 9млн строк(хотя базы данных работают с куда большими обьемами - на это они и расчитаны, на моем проекте 18млн строк и сайт летает как самолет)
    Лучше лишний раз показаться глупым и что то узнать, чем вы*бнуться и обосраться.

  8. #6
    Аватар для Seviel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2016
    Адрес
    Казахстан
    Сообщений
    148
    Репутация:
    26 ±
    Цитата Сообщение от SnyXes Посмотреть сообщение
    Тогда в этой таблице кол-во строк может дойти до 3 000 000 строк (если 100.000 аккаунтов зарегистрировано и у них всех по 25 друзей, я уже не говорю про запросы в друзья (входящие и исходящие, в них тоже макс. запросов 25), получается уже не 3 000 000, а 9 000 000).
    Работать с таким огромным кол-вом строк не оптимизированно я считаю. Большая нагрузка на MySQL сервер, да и вообще если вдруг мне понадобится вручную удалить какого-нибудь друга, я могу запросто это сделать изменив всего лишь одну ячейку в БД.
    3 миллиона строк SQL в легкую сможет обработать(ну тут форум(эт не реклама, честно) там можно посмотреть какие таблицы и как быстро они обрабатывают) ты получаешь выборку, допустим 25 строк, а обработать 25 строк в павн, дело легкое и не затратное(я 1000 строк в цикле обрабатываю, и у меня они обрабатываются за миллисекунды).
    Цитата Сообщение от SnyXes Посмотреть сообщение
    Большая нагрузка на MySQL сервер, да и вообще если вдруг мне понадобится вручную удалить какого-нибудь друга, я могу запросто это сделать изменив всего лишь одну ячейку в БД.
    Чтобы удалить друга, просто удаляешь строку, и поверь это будет легче чем удалить ячейку, вот так удалить строку
    PHP код:
    DELETE FROM `friendsWHERE `id`='Player' AND `friend`='friend'
    Если я правильно понимаю тебе придется разбить строку в массив удалить ячейку, а потом обратно склеить в строку?

  9. Пользователь сказал cпасибо:
    Blood (26.01.2017)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •