#c# #c #box2d #void-pointers
#c# #c #box2d #void-указатели
Вопрос:
В настоящее время я работаю над C #-совместимой DLL для Box2D и пытаюсь создать два отдельных метода — один для создания формы, а другой для создания приспособления.
Для инициализации приспособлению необходимо присвоить форму, поэтому, как только форма создается в его методе, она преобразуется в указатель void и отправляется обратно в C # для сохранения как IntPtr. Затем это передается в метод создания приспособления, когда требуется, и преобразуется обратно в тело из указателя. Код, который я использую, таков:
extern "C" __declspec(dllexport) void* CreateBoxShape(float width, float height,
float centreX, float centreY, float angle) {
b2Vec2 centre = b2Vec2(centreX, centreY);
b2PolygonShape* shape;
shape->SetAsBox(width, height, centre, angle);
return static_cast<void*>(shape);
}
extern "C" __declspec(dllexport) void* AddFixture(void* bodyPointer, void* shapePointer, float density) {
b2Body* m_body = static_cast<b2Body*>(bodyPointer);
b2Fixture* m_fixture;
b2PolygonShape* aShape = static_cast<b2PolygonShape*>(shapePointer);
b2PolygonShape shape = *aShape;
m_fixture = m_body->CreateFixture(amp;shape, density);
return static_cast<void*>(m_fixture);
}
Как вы можете догадаться, это не работает. Форма где-то по пути изменяется. Я не привык работать с указателями void или static_casts, поэтому буду признателен за любую помощь / предложения. Конструктор для CreateFixture:
b2Fixture * CreateFixture (const b2Shape *shape, float32 density)
Комментарии:
1. Вы возвращаете указатель на локальную переменную, которая перестанет существовать после возврата функции.
2. @PlasmaHH О, ты прав. Это смущает. Я изменил его. Однако код все еще не работает — я уверен, что это из-за указателя void, но я не могу по-настоящему разобраться в этом.
3. теперь ваш код использует неинициализированный указатель для вызова функции на нем и возвращает этот указатель… может быть, немного кофе?
4. @user3767203 Нет, это не «материал указателя void», это «материал указателя». Возможно, вам следует обратиться к своей книге по C для обновления?
5. Ах, хорошо. Теперь все исправлено. Спасибо за помощь. Я использую C # последние несколько месяцев, поэтому, думаю, моя память на C все еще немного скрипучая.