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

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Адрес
    Moscow
    Сообщений
    108
    Репутация:
    -1 ±

    bool + char - переполнение массива

    Как мне известно если использовать
    PHP код:
    new bool:racer[MAX_PLAYERS
    то racer[playerid] = либо true либо false
    Если же мы используем
    PHP код:
    new racer[MAX_PLAYERS char
    то racer[playerid] = значению от 1 до 255 включительно
    в одном интересном случае мне скинули код где используется и то и другое то есть выглядело это так
    PHP код:
    new bool:racer[MAX_PLAYERS char
    тут конечно же стал ругаться crashdetect но почемуто на переполнение массива - и он указал вот такую ошибку
    [17:44:01] [debug] Run time error 4: "Array index out of bounds"
    [17:44:01] [debug] Accessing element at index 29 past array upper bound 24
    и у меня 3 вопроса
    1)почему здесь ограничением стало именно 24?если MAX_PLAYERS по дефайну у меня 100?
    2)к чему приведет использование?
    PHP код:
    new bool:racer[MAX_PLAYERS char
    3)в случае с char корректно использовать racer{playerid} или racer[playerid] ?
    Последний раз редактировалось Maranzalla; 05.02.2015 в 20:18.

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Во-первых, массив с char может принимать значение от 0 до 255.
    Во-вторых, на счёт 24: Во время создания массива с типом char размер массива уменьшается в 4 раза. Но доступность к обращению ячейки не ограничивается. 100 / 4 = 25 ( 24 т.к. не даёт доступ к 25 части ).

    Если используете массив char, то во всех случаях нужно заключать ячейку в фигурные скобки:
    PHP код:
    test_array{551} = 255// 255 - максимальное значение для char 
    И не так давно я отписывался подробно на счёт данного вопроса, если хотите поищите в поиске по форуму или в разделе "Вопросы по pawn-скриптингу".

  3. 3 пользователя(ей) сказали cпасибо:
    #Vito (05.02.2015) $continue$ (08.07.2015) Maranzalla (05.02.2015)
  4. #3
    Аватар для Maranzalla
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Адрес
    Moscow
    Сообщений
    108
    Репутация:
    -1 ±
    Цитата Сообщение от Londlem Посмотреть сообщение
    Во-первых, массив с char может принимать значение от 0 до 255.
    Во-вторых, на счёт 24: Во время создания массива с типом char размер массива уменьшается в 4 раза. Но доступность к обращению ячейки не ограничивается. 100 / 4 = 25 ( 24 т.к. не даёт доступ к 25 части ).

    Если используете массив char, то во всех случаях нужно заключать ячейку в фигурные скобки:
    PHP код:
    test_array{551} = 255// 255 - максимальное значение для char 
    И не так давно я отписывался подробно на счёт данного вопроса, если хотите поищите в поиске по форуму или в разделе "Вопросы по pawn-скриптингу".
    немного не ясен ответ уменьшается в 4 раза размер массива или же размер ячейки массива,потому как говоря о доступности в моем случае уже 25-ый игрок из 100 уже выдает краш

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от Londlem Посмотреть сообщение
    Но доступность к обращению ячейки не ограничивается.
    То есть покажу на примере:
    PHP код:
    new
        
    player_admin_level[MAX_PLAYERS char]; // уровень админки может быть от 0 до 255 
    Данный массив будет создан так:
    PHP код:
    new
        
    player_admin_level[500 char]; // массив на 500 игроков ( по умолчанию в a_samp.inc ) 
    Обращаемся к к игроку с ID 325 ( например, случайный ID ):
    PHP код:
    player_admin_level{325} = 5// установили игроку с ID 325 уровень админки на 5 
    То есть делаем всё тоже самое как и с обычным массивом, только стоит помнить, что: при вызове ячейки массива используем фигурные скобки ( а не квадратные ); расходуется в 4 раза меньше памяти, чем при создании обычного массива, тобишь:
    PHP код:
    new
        
    player_admin_level[MAX_PLAYERS]; // player_admin_level[500]
        // 4 * 500 = 2000 ( 4 байта ( любая переменная в pawn занимает 4 байта ( кроме char ) ) * 500 игроков = 2000 байт )

    new
        
    player_admin_level[MAX_PLAYERS char]; // player_admin_level[500 char]
        // 1 * 500 = 500 ( 1 байт теперь занимает 1 ячейка в памяти, так как мы использовали char-массив ) 

  6. Пользователь сказал cпасибо:
    Maranzalla (06.02.2015)
  7. #5
    Аватар для Mazzilla
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.11.2013
    Адрес
    Нижневартовск
    Сообщений
    256
    Репутация:
    63 ±
    Delete. Не то написал.
    Последний раз редактировалось Mazzilla; 05.02.2015 в 23:49.

  8. #6
    Аватар для Maranzalla
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Адрес
    Moscow
    Сообщений
    108
    Репутация:
    -1 ±
    а ну тут получается что в 1 байт посути вмещается значение =2^8-1 то есть 255
    если же скажем наше значение админки 256 и выше то уже нужно использовать char*2 ?и каким будет пределом значение в таком случае?
    или надо тут MAX_PLAYERS*2 char?
    Последний раз редактировалось Maranzalla; 06.02.2015 в 00:27.

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Нельзя так делать. Если значение переменной ( ячейки массива ) в районе 0 <= x <= 255, то char, иначе обычный массив.

  10. Пользователь сказал cпасибо:
    Maranzalla (06.02.2015)
  11. #8
    Аватар для Maranzalla
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    25.04.2014
    Адрес
    Moscow
    Сообщений
    108
    Репутация:
    -1 ±
    то есть, можно использовать 4 битные или же 1 битные(с помощью 'char') но 2-3 битные значения уже нельзя?и,кстати, при 4 битах какое максимальное значение?

 

 

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

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

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

Ваши права

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