Просмотр полной версии : [Вопрос] 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] ?
Во-первых, массив с 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 уже выдает краш
Но доступность к обращению ячейки не ограничивается.
То есть покажу на примере:
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?
Нельзя так делать. Если значение переменной ( ячейки массива ) в районе 0 <= x <= 255, то char, иначе обычный массив.
Maranzalla
06.02.2015, 00:42
то есть, можно использовать 4 битные или же 1 битные(с помощью 'char') но 2-3 битные значения уже нельзя?и,кстати, при 4 битах какое максимальное значение?
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot