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

    Статус
    Оффлайн
    Регистрация
    30.06.2015
    Сообщений
    6
    Репутация:
    0 ±

    Crash в public CheckGas ()

    Добрый день пользователи pro-pawn.ru, Мне нужна помощь c крашем в server_log.
    Вроде исравил 1 раз этот краш убрав +1 в for(new c = 0; c < CAR_AMOUNT+1; c++) но сломался бензин, сломался как отнимает 1 литр если двигатель выключен а если включен то отнимает 2 литра. Помогите решить это проблему, кому не сложно
    Вот лог краша
    PHP код:
    [22:39:05] [debugRun time error 4"Array index out of bounds"
    [22:39:05] [debug]  Accessing element at index 999 past array upper bound 998
    [22:39:05] [debugAMX backtrace:
    [
    22:39:05] [debug#0 000bf4d4 in public CheckGas () at D:\База данных сервера CRMP\База данных\new.pwn:16190 
    Вот паблик
    PHP код:
    public CheckGas()
    {
        for(new 
    0CAR_AMOUNT+1c++)
        {
            if(!
    BikeVeh(c) && !PlaneVeh(c) && !BoatVeh(c))
            {
                if(
    Gas[c] > 0)// строчка 16190
                
    {
                    if(
    EngineCar[c] == 1)
                    {
                        
    Gas[c] -= 1;
                    }
                    
    /*else if(EngineCar[c] == 0)
                    {
                        Gas[c] -= 0;
                    }*/
                
    }
                else
                {
                      
    EngineCar[c] = 0;
                    new 
    engine,lights,alarm,doors,bonnet,boot,objective;
                      
    GetVehicleParamsEx(c,engine,lights,alarm,doors,bonnet,boot,objective);
                      
    SetVehicleParamsEx(c,0,0,alarm,doors,bonnet,boot,objective);
                }
            }
        }
        for(new 
    i=0;i<MAX_PLAYERS;i++)
        {
            if(
    IsPlayerConnected(i) && !IsPlayerNPC(i))
               {
                   if(
    GetPlayerState(i) == PLAYER_STATE_DRIVER)
                   {
                       new 
    vehicle GetPlayerVehicleID(i);
                       new 
    carid GetPlayerVehicleID(i);
                       new 
    model GetVehicleModel(carid);
                    if(
    Gas[vehicle] >= 1)
                       {
                           if(
    Gas[vehicle] <= 10) { PlayerPlaySound(i10850.00.00.0); }
                        if(
    IsAPlane(vehicle) || IsABoat(vehicle) || IsABike(vehicle) || model == 537 || model == 437) { Gas[vehicle]++; }
                          
    Gas[vehicle]-=1;
                       }
                       else
                       {
                          
    NoFuel[i] = 1;
                          
    TogglePlayerControllable(i0);
                        
    SendClientMessage(iCOLOR_YELLOW"У вашего автомобиля кончился бензин! Для выхода введите /exit.");
                    }
                }
            }
        }
        return 
    1;


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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    CAR_AMOUNT - покажи инициализацию

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

    Статус
    Оффлайн
    Регистрация
    30.06.2015
    Сообщений
    6
    Репутация:
    0 ±
    #define CAR_AMOUNT 998

    new Gas[CAR_AMOUNT];

    for(new c=0;c<CAR_AMOUNT;c++)
    {
    Gas[c] = GasMax;
    }

  4. #4
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    А случайно значение не уходить в отрицательное значение?
    PHP код:
    public CheckGas()
    {
        for(new 
    0CAR_AMOUNT+1c++)
        {
            if(
    Gas[c] == 0// стоит сделать наверное вот так, что бы опращения к массиву не было отрицательным
                
    break;
            if(!
    BikeVeh(c) && !PlaneVeh(c) && !BoatVeh(c))
            {
                if(
    Gas[c] > 0)// строчка 16190
                
    {
                    if(
    EngineCar[c] == 1)
                    {
                        
    Gas[c] -= 1;
                        
    printf("Gas[c]: %d"Gas[c]);
                    }
                    
    /*else if(EngineCar[c] == 0)
                    {
                        Gas[c] -= 0;
                    }*/
                
    }
                else
                {
                      
    EngineCar[c] = 0;
                    new 
    engine,lights,alarm,doors,bonnet,boot,objective;
                      
    GetVehicleParamsEx(c,engine,lights,alarm,doors,bonnet,boot,objective);
                      
    SetVehicleParamsEx(c,0,0,alarm,doors,bonnet,boot,objective);
                }
            }
        }
        for(new 
    i=0;i<MAX_PLAYERS;i++)
        {
            if(
    IsPlayerConnected(i) && !IsPlayerNPC(i))
               {
                   if(
    GetPlayerState(i) == PLAYER_STATE_DRIVER)
                   {
                       new 
    vehicle GetPlayerVehicleID(i);
                       new 
    carid GetPlayerVehicleID(i);
                       new 
    model GetVehicleModel(carid);
                    if(
    Gas[vehicle] >= 1)
                       {
                           if(
    Gas[vehicle] <= 10) { PlayerPlaySound(i10850.00.00.0); }
                        if(
    IsAPlane(vehicle) || IsABoat(vehicle) || IsABike(vehicle) || model == 537 || model == 437) { Gas[vehicle]++; }
                          
    Gas[vehicle]-=1;
                       }
                       else
                       {
                          
    NoFuel[i] = 1;
                          
    TogglePlayerControllable(i0);
                        
    SendClientMessage(iCOLOR_YELLOW"У вашего автомобиля кончился бензин! Для выхода введите /exit.");
                    }
                }
            }
        }
        return 
    1;


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

    Статус
    Оффлайн
    Регистрация
    30.06.2015
    Сообщений
    6
    Репутация:
    0 ±
    Уходит каждые 30 секунд если выключен двигатель при этой строчке (new c = 0; c < CAR_AMOUNT; c++)

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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от Vicher Посмотреть сообщение
    Уходит каждые 30 секунд если выключен двигатель при этой строчке (new c = 0; c < CAR_AMOUNT; c++)
    То есть?

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

    Статус
    Оффлайн
    Регистрация
    30.06.2015
    Сообщений
    6
    Репутация:
    0 ±
    Ну пример, стоит for(new c = 0; c < CAR_AMOUNT+1; c++), работает бензин нормально, но выдает краш Accessing element at index 999 past array upper bound 998 #0 000bf4d4 in public CheckGas (), на каждое авто.
    Ставлю for(new c = 0; c < CAR_AMOUNT; c++) без +1, пропадает еррор но ломаеться система бензина, по идеи каждые 30 сек если двигатель заведен то отнимается -1 от макс-колво бензина, а тут по другому если заведен то отнимается по -2 каждые 30сек, а если двигатель заглушен то отнимается по -1 каждые 30сек, вот и вся проблема хз как исправить. А ерроры вызывают вылеты вот решил их всех убрать.

  8. #8
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Нумерация ID транспорта на сервере начинается не с 0, а с 1.
    ID 0 обычно возвращает функция GetPlayerVehicleID, когда укзанный игрок не находится в транспорте.
    Вообще под несуществующий транспорт существует константа INVALID_VEHICLE_ID ( = 65535), и было бы логично возвращать именно это значение в INVALID_VEHICLE_ID, но кому, чёрт возьми, нужна логика, это же SA:MP!

    Поэтому нумерация транспорта на сервере начинается именно с 1 и заканчивается MAX_VEHICLES.
    Вот пример правильного обращения с массивом свойств транспорта:
    PHP код:
    new car_fuel[MAX_VEHICLES];

    // ...

    // Обратите внимание: перебор начинается с 1 до MAX_VEHICLES (включительно).
    // При этом обращение происходит к i-1 элементу, т.к. в массиве нумерация начинается с 0.
    for(new 1<= MAX_VEHICLES; ++i)
        
    car_fuel[i-1] = 0
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. Пользователь сказал cпасибо:
    $continue$ (01.07.2015)
  10. #9
    Аватар для #ball
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.06.2014
    Адрес
    Rostov-on-Don
    Сообщений
    119
    Репутация:
    14 ±
    Accessing element at index 999 past array upper bound 998

    PHP код:
    #define CAR_AMOUNT 998 
    Думайте

  11. #10
    Аватар для Vicher
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.06.2015
    Сообщений
    6
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Нумерация ID транспорта на сервере начинается не с 0, а с 1.
    ID 0 обычно возвращает функция GetPlayerVehicleID, когда укзанный игрок не находится в транспорте.
    Вообще под несуществующий транспорт существует константа INVALID_VEHICLE_ID ( = 65535), и было бы логично возвращать именно это значение в INVALID_VEHICLE_ID, но кому, чёрт возьми, нужна логика, это же SA:MP!

    Поэтому нумерация транспорта на сервере начинается именно с 1 и заканчивается MAX_VEHICLES.
    Вот пример правильного обращения с массивом свойств транспорта:
    PHP код:
    new car_fuel[MAX_VEHICLES];

    // ...

    // Обратите внимание: перебор начинается с 1 до MAX_VEHICLES (включительно).
    // При этом обращение происходит к i-1 элементу, т.к. в массиве нумерация начинается с 0.
    for(new 1<= MAX_VEHICLES; ++i)
        
    car_fuel[i-1] = 0
    Что-то я вас не понял.

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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