PDA

Просмотр полной версии : [Вопрос] bool + char - переполнение массива



Maranzalla
05.02.2015, 20:14
Как мне известно если использовать

new bool:racer[MAX_PLAYERS]то racer[playerid] = либо true либо false
Если же мы используем

new racer[MAX_PLAYERS char] то racer[playerid] = значению от 1 до 255 включительно
в одном интересном случае мне скинули код где используется и то и другое то есть выглядело это так

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)к чему приведет использование?
new bool:racer[MAX_PLAYERS char]
3)в случае с char корректно использовать racer{playerid} или racer[playerid] ?

L0ndl3m
05.02.2015, 21:01
Во-первых, массив с char может принимать значение от 0 до 255.
Во-вторых, на счёт 24: Во время создания массива с типом char размер массива уменьшается в 4 раза. Но доступность к обращению ячейки не ограничивается. 100 / 4 = 25 ( 24 т.к. не даёт доступ к 25 части ).

Если используете массив char, то во всех случаях нужно заключать ячейку в фигурные скобки:

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

Maranzalla
05.02.2015, 22:40
Во-первых, массив с char может принимать значение от 0 до 255.
Во-вторых, на счёт 24: Во время создания массива с типом char размер массива уменьшается в 4 раза. Но доступность к обращению ячейки не ограничивается. 100 / 4 = 25 ( 24 т.к. не даёт доступ к 25 части ).

Если используете массив char, то во всех случаях нужно заключать ячейку в фигурные скобки:

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

немного не ясен ответ уменьшается в 4 раза размер массива или же размер ячейки массива,потому как говоря о доступности в моем случае уже 25-ый игрок из 100 уже выдает краш

L0ndl3m
05.02.2015, 23:38
Но доступность к обращению ячейки не ограничивается.
То есть покажу на примере:


new
player_admin_level[MAX_PLAYERS char]; // уровень админки может быть от 0 до 255

Данный массив будет создан так:


new
player_admin_level[500 char]; // массив на 500 игроков ( по умолчанию в a_samp.inc )


Обращаемся к к игроку с ID 325 ( например, случайный ID ):


player_admin_level{325} = 5; // установили игроку с ID 325 уровень админки на 5


То есть делаем всё тоже самое как и с обычным массивом, только стоит помнить, что: при вызове ячейки массива используем фигурные скобки ( а не квадратные ); расходуется в 4 раза меньше памяти, чем при создании обычного массива, тобишь:


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-массив )

Mazzilla
05.02.2015, 23:46
Delete. Не то написал.

Maranzalla
06.02.2015, 00:23
а ну тут получается что в 1 байт посути вмещается значение =2^8-1 то есть 255
если же скажем наше значение админки 256 и выше то уже нужно использовать char*2 ?и каким будет пределом значение в таком случае?
или надо тут MAX_PLAYERS*2 char?

L0ndl3m
06.02.2015, 00:31
Нельзя так делать. Если значение переменной ( ячейки массива ) в районе 0 <= x <= 255, то char, иначе обычный массив.

Maranzalla
06.02.2015, 00:42
то есть, можно использовать 4 битные или же 1 битные(с помощью 'char') но 2-3 битные значения уже нельзя?и,кстати, при 4 битах какое максимальное значение?