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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±

    Выход за пределы

    В коннекте таймер замутил:
    PHP код:
        SetTimerEx("LoadConnect",17500,0,"d",playerid); 
    Далее примерно такая конструкция кода:

      Открыть/закрыть
    PHP код:
            forward LoadConnect(playerid);
        public 
    LoadConnect(playerid)
        {
            
    format(mysql_query,sizeof(mysql_query),"SELECT `Name` FROM `Accounts` WHERE `Name` = '%s'",PlayerInfo[playerid][pNames]);
            
    mysql_function_query(connectsmysql_query,true,"PlayerRegCheck","d",playerid);
            
    RemoveBuildingForPlayer(playerid82291142.03131362.500012.48440.25);
            
    URL[playerid] = TextDrawCreate(509.0000003.000000"RP");// íàçâàíèå, è êîîðäèíàòû
            
    TextDrawFont(URL[playerid], 1);// ñòèëü òåêñòà
            
    TextDrawColor(URL[playerid], COLOR_ULTI);//öâåò òåêñòà - ãîëóáîé
            
    TextDrawLetterSize(URL[playerid], 0.36001.500000);// ðàçìåðû
            
    TextDrawSetOutline(URL[playerid], 2);
            
    TextDrawShowForPlayer(playeridURL[playerid]);
            
    FPS[playerid] = TextDrawCreate(8.000000428.000000"FPS: 30");
            
    TextDrawBackgroundColor(FPS[playerid], 255);
            
    TextDrawFont(FPS[playerid], 3);
            
    TextDrawLetterSize(FPS[playerid], 0.2800001.500000);
            
    TextDrawColor(FPS[playerid], COLOR_ULTI);
            
    TextDrawSetOutline(FPS[playerid], 2);
            
    TextDrawSetProportional(FPS[playerid], 1);
            
    //==============================================
            
    Text[playerid] = TextDrawCreate(400.010.0"Text");
            
    TextDrawBackgroundColor(Text[playerid], COLOR_BLACK);
            
    TextDrawColor(Text[playerid], 0x0BB814FF);
            
    TextDrawFont(Text[playerid], 3);
            
    //==============================================
            
    Bar1 CreateProgressBar(playerid,468.00,420.00,100.00,4.00,0xFFA600AA,100.0);
            
    HideProgressBar(playerid,Bar1);
            
    Bar2 CreateProgressBar(playerid,548.00,28.00,60.00,3.20,0x0265B6AA,100.0);
            
    HideProgressBar(playerid,Bar2);
            
    PlayerTimerID[playerid] = SetTimerEx("PlayerUpdate"2501"d"playerid);
            return 
    1;
        } 


    Когда на сервер входит 24ый игрок или выше вот такие ошибки в логах:
      Открыть/закрыть
    PHP код:
    [16:45:25] [debugRun time error 4"Array index out of bounds"
    [16:45:25] [debug]  Accessing element at index 24 past array upper bound 23
    [16:45:25] [debugAMX backtrace:
    [
    16:45:25] [debug#0 0027368c in public LoadConnect (24) from beta41.amx 

    Выход за пределы вижу, но где он скрывается я не пойму

  2. #2
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Но ведь загрузку можно делать всего один раз, а ТД создавать при коннекте 9((

  3. #3
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Но ведь загрузку можно делать всего один раз, а ТД создавать при коннекте 9((
    Я просто увидел в каком то коде что ТД при коннекте создают вот и делаю так, а что в этом плохого?

  4. #4
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Очевидно же, что из-за playerid происходит выход за пределы массива, и нам необходимо искать все, что связанно с ним. В вашем коде большое количество разнообразных массивов, которые используют playerid. Во-первых, проверьте все массивы на максимальный размер; если увидите число 23, то это тот массив, который нам нужен. Далее, нам нужно изменить максимальный размер данного массива на MAX_PLAYERS.

    Во-вторых, вам необходимо прочитать:

  5. #5
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Покажи код обьявления массивов URL, FPS, Text и PlayerTimerID.

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

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    PHP код:
    Text:URL[MAX_PLAYERS]
    Text:Text[MAX_PLAYER_NAME]
    PlayerTimerID[MAX_PLAYERS
    - - - Добавлено - - -

    Цитата Сообщение от VVWVV Посмотреть сообщение
    Во-первых, проверьте все массивы на максимальный размер; если увидите число 23, то это тот массив, который нам нужен. Далее, нам нужно изменить максимальный размер данного массива на MAX_PLAYERS.[/LIST][/INDENT]
    Таких цифр нету уже проверял до того как выложить =( Вот и пишу сюда..
    Последний раз редактировалось vovandolg; 05.01.2016 в 18:58. Причина: ZZ исправил на Text перепутал

  7. #7
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Text:Text[MAX_PLAYER_NAME] ошибка тут.
    Константа MAX_PLAYER_NAME и равна 24.
    Решение:
    PHP код:
    Text:Text[MAX_PLAYERS

  8. Пользователь сказал cпасибо:
    vovandolg (05.01.2016)
  9. #8
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    А для чего [MAX_PLAYER_NAME] использовать лучше всего?
    Помимо GetPlayerName

  10. #9
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    А для чего [MAX_PLAYER_NAME] использовать лучше всего?
    Помимо GetPlayerName
    PHP код:
    if(strlen(name) < MAX_PLAYER_NAME && strlen(name) > 5)
    {
        
    SendClientMessage(playerid, -1"У вас шикарное количество символов в имени!");


  11. #10
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    А для чего [MAX_PLAYER_NAME] использовать лучше всего?
    Помимо GetPlayerName
    Эмм, советую прочесть статьи о макросах, ибо Вы совсем не имеете представления о том, что это такое, как я вижу
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  12. Пользователь сказал cпасибо:
    vovandolg (05.01.2016)
 

 

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

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

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

Ваши права

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