PDA

Просмотр полной версии : Как правильно проверить наличие переменной ?


iillyyaa
21.08.2010, 00:13
начинал делать через простую проверку

if (что_то) { }

к примеру проверить есть ли спрайт, точнее элемент из массива..

if (box_x_y[xx][yy]) {

но столкнулся с некой проблемой, если создаётся массив, но некоторые элементы не создаются вовсе, то проверка глючит и ничего не работает :)

сделал всё через

try


вот что было, и что сделал..

if (box_x_y[xx][yy]) {
removeChild(box_x_y[xx][yy]);
delete box_x_y[xx][yy];
}


try {
//if (box_x_y[xx][yy]) {
removeChild(box_x_y[xx][yy]);
delete box_x_y[xx][yy];
}
catch (error:Error) {}

так работает всё, но мне кажется это не совсем верно..


а проверка делается, т.к. этот элемент мог быть или уже удалён или не создан вообще..

так вот как правильно проверить ? :umnik2:

-De-
21.08.2010, 02:53
Дело в том, что элемента box_x_y[xx] может не быть. Тогда при попытке доступа к его любому элементу (т.е. (box_x_y[xx])[yy]) возникает ошибка доступа. Т.е. надо проверять проверять наличие не только box_x_y[xx][yy] но и перед этим наличие box_x_y[xx]. Если у вас гарантированно box_x_y[xx] либо нет, либо массив и box_x_y[xx][yy] либо нет либо то, для чего можно безбоязненно вызвать removeChild, то проверка вот например.
if(box_x_y[xx] && box_x_y[xx][yy]) {

Котяра
21.08.2010, 02:56
if (box_x_y[xx] && box_x_y[xx][yy])
UPD- не увидел выше..
а вообще срочно ищите в гугле as3 code convention

iillyyaa
21.08.2010, 03:04
спасибо, так работает.. :drinks:

не всё логично в языке.. (покрайней мере для меня :wacko:)

MrPoma
21.08.2010, 05:19
А вы попробуйте не использовать вложенные массивы :-)

Котяра
21.08.2010, 05:54
2рома. матрица -

OwnerOfSuccuby
21.08.2010, 14:57
Я слышал, что часто вроде масив когда создают - изначально забивают его какими то левыми значениями - чтобы потом было легче проверять - к примеру если в программе везде числа бльше 0 то ставят к примеру -1 , чтобы знать что ячейка пуста.

iillyyaa
21.08.2010, 15:23
OwnerOfSuccuby, массив может не содержать значений, а быть всего лишь именем квадрата или любого другого графического или ещё какого элемента..

MrPoma, забавно, а как нарисовать шахматную доску к примеру без вложенного массива ?

Psycho Tiger
21.08.2010, 15:23
undefined вполне справится с этой ситуацией, если массив ничем не забить =)

Добавлено через 1 минуту
iillyyaa, двумерный массив можно разложить в одномерный. Но Mr Poma минус от меня, я не вижу ничего плохого даже во вложенных векторах.

iillyyaa
21.08.2010, 15:27
Psycho Tiger, можно пример ? как разложить в одномерный ?

было поле 5х5, добавляем строку или столбец... как изменится массив ? или удаляем 3 столбец..

а массив то может быть не только двумерным, но и трёхмерным и т.д.

etc
21.08.2010, 15:40
if (xx in box_x_y && yy in box_x_y[xx])

iillyyaa
21.08.2010, 15:42
etc, это чё такое ? :) и почему этот вариант лучше предыдущего ?

etc
21.08.2010, 15:46
Тем, что он именно наличие индексов проверяет.

Psycho Tiger
21.08.2010, 16:11
Это справедливо только для прямоугольного двумерного массива.
Такой массив
1, 0, 1
0, 1, 0
0, 0, 0

Можно представить как
1, 0, 1, 0, 1, 0, 0, 0, 0
И зная "ширину" этого массива (у нас 3) можно обратиться к любой ячейке.
Например, 1 строка 2 столбец (индексация с 0):
ширина * 1 + 2
5 элемент массива в одномерном.

Добавлено через 1 минуту
При удалении, конечно, нужно взять бумажку и ручку, почертить и подумать, вывести формулы чтобы добавить новый столбец или убрать.

Я не говорю, что это удобно. Это просто ответ на вопрос "как".

iillyyaa
21.08.2010, 16:55
Psycho Tiger, тоесть, мне нужно вводить ещё 1-2-3 переменных, в которых хранить "ширину" ?

опять же, у меня может быть массив всего лишь вот такой..

x[1][1]=1; x[3][4]=2; x[8][7]=3;

а так мне придётся держать переменную ширины, потом формулами вычислять.. или вы лёгких путей не ищите ? :)

Добавлено через 2 минуты
etc, мне нужно проверить существует ли объект или данные или что то ещё с этой ячейке массива.. если существуют, провести с ними некие действия.. или даже не с ними а с чем то ещё..

Psycho Tiger
21.08.2010, 20:11
iillyyaa, решения в лоб не всегда самые лучшие.