Siddhant Bhati Ответов: 1

Что означает это утверждение?


Ship *player = static_cast<Ship *>(a == player_ ? a : (b == player_ ? b : 0));




Я знаю, что такое static_cast, но не знаю, что делается с условными операторами.

First-chance exception at 0x00DDD250 in AsteroidsTest_2012.exe: 0xC0000005: Access violation reading location 0xFEEEFEF6.


Мне просто нужны подсказки о том, что может быть не так. Не прямые ответы. Я найду ответ сама. Мне просто нужен намек.

Кстати авария забирает меня сюда: -

void Collision::DoCollisions(Game *game) const
{
	for (ColliderList::const_iterator colliderAIt = colliders_.begin(), end = colliders_.end();
		colliderAIt != end;
		++colliderAIt)
	{
		ColliderList::const_iterator colliderBIt = colliderAIt;
		for (++colliderBIt; colliderBIt != end; ++colliderBIt)
		{
			Collider *colliderA = *colliderAIt;
			Collider *colliderB = *colliderBIt;
			if (CollisionTest(colliderA, colliderB))
			{
				game->DoCollision(colliderA->entity, colliderB->entity);
			}
		}
	}
}


Что я уже пробовал:

Попытался исправить эту проблему, но я приземляюсь на этот код

1 Ответов

Рейтинг:
9

OriginalGriff

Посмотрите на это: это просто вложенный условный знак.

a == player_ ? a : (b == player_ ? b : 0)

Если a == player_, то он возвращает a.
В противном случае, если b == player_, то он возвращает b.
Если оба теста не она возвращает 0

Думайте об этом как о "на месте, если":
if (a == player_)
   return a;
else if (b == player_)
   return b;
return 0;


Siddhant Bhati

О, Спасибо, чувак.

Могу я задать вам еще несколько вопросов по поводу этого кода? Я просто хочу, чтобы вы намекнули мне, на что я должен пойти.

Так что это игра типа астероида и когда игрок или пуля сталкивается с астероидом игра падает и забирает меня сюда :-

void Collision::DoCollisions(Game *game) const
{
for (ColliderList::const_iterator colliderAIt = colliders_.begin(), end = colliders_.end();
colliderAIt != конец;
++colliderAIt)
{
ColliderList::const_iterator colliderBIt = colliderAIt;
for (++colliderBIt; colliderBIt != end; ++colliderBIt)
{
Коллайдер *colliderA = *colliderAIt;
Коллайдер *colliderB = *colliderBIt;
if (CollisionTest(colliderA, colliderB))
{
игра->DoCollision(colliderA->entity, colliderB->entity);
}
}
}
}


Исключение первого шанса при 0x00CFD250 в AsteroidsTest_2012.exe: 0xC0000005: нарушение доступа к местоположению чтения 0xFEEEFEF6.

OriginalGriff

Вы действительно должны задать этот новый вопрос, но на первый взгляд - а я не могу запустить ваш код, так что это все, что может быть - один из ваших указателей не прав.

Используйте отладчик для изучения того, что происходит во время выполнения кода, и это должно помочь вам выяснить, какой указатель плох, и это должно помочь вам найти, почему он плох!

Siddhant Bhati

Эй, Спасибо,

я думаю, что в этом для (++colliderBIt; colliderBIt != end; ++colliderBIt)
{
Коллайдер *colliderA = *colliderAIt;
Коллайдер *colliderB = *colliderBIt;
if (CollisionTest(colliderA, colliderB))
{
игра->DoCollision(colliderA->entity, colliderB->entity);
}
}

ColliderA не будет получать значения или получать какую-либо выделенную память. Так ведь? или каждый раз он может получать одно и то же значение ColliderAIt.

Это может быть проблемой?

OriginalGriff

Проверьте с помощью отладчика - он покажет вам точно, что находится в какой переменной, и это единственный способ быть уверенным.
Вы присваиваете значение colliderA (от colliderAlt), но я никак не могу узнать, что, черт возьми, там содержится! :смеяться:

Серьезно, вам нужно использовать отладчик - это самый простой способ узнать, а не гадать.

Siddhant Bhati

Он говорит, что невозможно прочитать память для radius, entity и enabled. Возможно они пусты вот почему

OriginalGriff

Так что посмотрите, почему. Установите точки останова там, где они должны быть установлены, и посмотрите, что произойдет.

Siddhant Bhati

Я попытался отладить его, но не смог понять, в чем проблема -:

void Collision::DoCollisions(Game *game) const
{
for (ColliderList::const_iterator colliderAIt = colliders_.begin(), end = colliders_.end();
colliderAIt != конец;
++colliderAIt)
{
ColliderList::const_iterator colliderBIt = colliderAIt;
for (++colliderBIt; colliderBIt != end; ++colliderBIt)
{
Коллайдер *colliderA = *colliderAIt;
Коллайдер *colliderB = *colliderBIt;
if (CollisionTest(colliderA, colliderB))
{
игра->DoCollision(colliderA->entity, colliderB->entity);
}
}
}
}

это и есть Collision.cpp

void Game::DoCollision(GameEntity *a, GameEntity *b)
{
Корабль *игрок = метод static_cast&ЛТ;корабль *&ГТ;(а == player_ ? a : (b == player_ ? b : 0));
Пуля *пуля = метод static_cast&ЛТ;пуля *&ГТ;(IsBullet(а) ? а : (IsBullet(б) ? б : 0));
Астероид *Астероид = static_cast<астероид *>(IsAsteroid(a) ? a : (IsAsteroid(b) ? b : 0));

если (игрок && астероид)
{
AsteroidHit(астероид);
DeletePlayer();
}

если (пуля && астероид)
{
AsteroidHit(астероид);
DeleteBullet(пуля);
}
}

это и есть Game.cpp

bool Collision::CollisionTest(Collider *a, Collider *b)
{
if (a->enabled == false)
возвращать false;
if (b->enabled == false)
возвращать false;

D3DXVECTOR3 diff;
D3DXVec3Subtract(&ампер;дифференциал, &амп;а->в положении &амп;б-&ГТ;положение);
float distance = D3DXVec3Length(&diff);
если (расстояние < (a->радиус + b->радиус))
{
вернуть true;
}

возвращать false;
}

это коллизионтест в Collision.cpp

OriginalGriff

Мы не можем запустить этот код в тех же условиях, что и вы, поэтому мы не можем дублировать вашу проблему.

Вот почему у вас есть отладчик - так что вы можете точно узнать, что "пусто", а затем использовать отладчик для отслеживания через ваш код, чтобы выяснить, почему. Но для этого нужно, чтобы вы запускали код и имели проблему - и единственный человек, который может это сделать, - это вы!

Итак, что именно вы сделали с отладчиком и что именно он показал?

Siddhant Bhati

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

OriginalGriff

Как вы использовали отладчик?
Где вы поставили точку останова?
Что именно он вам показал?
Что было в различных переменных?

Это звучит так, как будто вы понятия не имеете, что такое отладчик, а тем более как его использовать! :смеяться:

Siddhant Bhati

Я использовал точки останова, где инициализируются коллайдеры. Например. Астероид *Астероид = метод static_cast&ЛТ;астероид *&ГТ;(IsAsteroid(а) ? а : (IsAsteroid(б) ? б : 0)); здесь
когда я смотрю на местных жителей, он дает правильные значения a и b, но когда я смотрю на компоненты игрока и астероида, он показывает, что он не может прочитать память угла, угловой скорости и размера. То же самое и для игрока

OriginalGriff

Поместите точку останова в верхней части метода и выполните пошаговые инструкции.
Вам нужно посмотреть, что именно входит в качестве А и В, и что они в конечном итоге устанавливают игрок, пуля и астероид. Потому что если вы начинаете смотреть на свой код, он не смотрит на угол, скорость или размер! Так что либо это не код, выдающий ошибку, либо вы предполагаете что-то, что не обязательно верно. Не предполагайте, проверьте!

Siddhant Bhati

В A астероид инициализируется, а в B пуля инициализируется, даже когда я не стреляю.

Кроме того, у меня тоже есть этот метод
пустота игры::AsteroidHit(астероид *Астероид)
{
int oldSize = asteroid->GetSize();
if (oldSize > 1)
{
int smallerSize = oldSize -1;
D3DXVECTOR3 position = астероид->GetPosition();
SpawnAsteroidAt(позиция, меньший размер);
SpawnAsteroidAt(позиция, меньший размер);
}
Делетеастероид(астероид);
}

вы уверены, что размер не повлияет на него, потому что он не смог прочитать размер?

OriginalGriff

И почему ты так думаешь?
Проверяли ли вы, откуда берутся объекты, которые вы передаете этому методу?

Так как это - кажется - неправильные объекты, вы должны знать, что они должны быть!

Siddhant Bhati

А и Б должны быть либо астероидом, либо игроком, пока я не выстрелю ни одной пули. да, я проверил, откуда они берутся ... Collision.cpp

Отсюда -:
void Collision::DoCollisions(Game *game) const
{
for (ColliderList::const_iterator colliderAIt = colliders_.begin(), end = colliders_.end();
colliderAIt != конец;
++colliderAIt)
{
ColliderList::const_iterator colliderBIt = colliderAIt;
for (++colliderBIt; colliderBIt != end; ++colliderBIt)
{
Коллайдер *colliderA = *colliderAIt;
Коллайдер *colliderB = *colliderBIt;
if (CollisionTest(colliderA, colliderB))
{
игра->DoCollision(colliderA->entity, colliderB->entity);
}
}
}
}

OriginalGriff

И что же показывает отладчик там есть?

Да ладно, это займет целую вечность, если мне придется сказать вам, чтобы вы проверяли каждую переменную всю обратную дорогу... :смеяться:

Siddhant Bhati

Ха-ха, Он показывает а как астероид и Б как пулю, когда начинается игра. Это то, о чем вы спрашиваете, верно?

OriginalGriff

Так как же твоя пуля попадает туда, куда не должна?

Давай - следуй коду, пока он работает, и он должен где-то появиться...

Siddhant Bhati

Могу я связаться с вами лично? Я имею в виду почту или что-нибудь еще?

OriginalGriff

Нет, извините!