Edit: Удалены некоторые бесполезные кодИнициализация константный символ **
Я использую IMGUI для GUI библиотеки моей игры, и я пытаюсь реализовать ListBoxes. Однако мой const char **, похоже, не читается правильно IMGUI.
#include <tinydir.h>
#include <tinyxml2.h>
#include <cpplocate/ModuleInfo.h>
#include <cpplocate/cpplocate.h>
#include <iostream>
#include <easylogging++.h>
#include "DmuxCommon.hpp"
#include "Garage.hpp"
#include "client/Game.hpp"
irr::f32 garageRotationRate = irr::f32(1.0f);
irr::f32 gChassisRotation;
irr::f32 gCameraRotation;
int selection = 0;
namespace menu {
const char **Garage::names;
Garage::Garage() :
Gui(),
pMainScreen(Game::device->getSceneManager()->addEmptySceneNode()),
pMoonScreen(Game::device->getSceneManager()->addEmptySceneNode()),
availableChassis(getAvailableChassises()) {
// Prepare double rendering
pRenderTarget = Game::device->getVideoDriver()->addRenderTargetTexture(irr::core::dimension2d<irr::u32>(384, 300), "Moon");
pRenderTextureID = pGUI->createTexture(pRenderTarget);
names = new const char *[availableChassis.size()];
for(unsigned int i = 0; i < availableChassis.size(); ++i) {
names[i] = availableChassis[i].c_str();
}
for(unsigned int i = 0; i < availableChassis.size(); ++i) {
std::cout << names[i] << std::endl; // This shows the content of the const char ** correctly
}
}
void Garage::show() {
//Rendering the node
Game::device->getVideoDriver()->setRenderTarget(pRenderTarget, true, true, irr::video::SColor(255, 120.0f, 120.0f, 120.0f));
pMoonScreen->setVisible(true);
pMainScreen->setVisible(false);
Game::device->getSceneManager()->setActiveCamera(pMoonCam);
Game::device->getSceneManager()->drawAll();
Game::device->getVideoDriver()->setRenderTarget(0, true, true, irr::video::SColor(255, 100, 101, 140));
pMoonScreen->setVisible(false);
pMainScreen->setVisible(true);
Game::device->getSceneManager()->setActiveCamera(pMainCam);
pGUI->updateTexture(pRenderTextureID, pRenderTarget);
if(gChassis == nullptr) {
gChassis = Game::device->getSceneManager()->addMeshSceneNode(Game::device->getSceneManager()->getMesh((std::string(cpplocate::findModule("dmux").value("chassisDir") + "el-camino/el-camino.obj")).c_str()));
gChassis->setParent(pMoonScreen);
gChassis->setPosition(irr::core::vector3df(0, 0, 0));
gChassis->setMaterialFlag(irr::video::EMF_LIGHTING, false);
gChassis->setMaterialFlag(irr::video::EMF_BACK_FACE_CULLING, false);
pMainCam = Game::device->getSceneManager()->addCameraSceneNode(pMoonScreen, irr::core::vector3df(0, 0, 0), irr::core::vector3df(0, 0, 0));
pMoonCam = Game::device->getSceneManager()->addCameraSceneNode(pMoonScreen, irr::core::vector3df(0, 0, -5), irr::core::vector3df(0, 0, 0));
pMoonCam->setTarget(gChassis->getPosition());
gCameraRotation = irr::f32(1.0f);
}
ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f));
ImGui::SetNextWindowSize(ImVec2(Game::playerSettings.currentWindowSize.first,
Game::playerSettings.currentWindowSize.second - (Game::playerSettings.currentWindowSize.second/9)));
ImGui::Begin("Customize a combat vehicle");
ImGui::PushItemWidth(120);
ImGui::ListBox("", &selection, names, ((int)(sizeof(names)/sizeof(*names))));
ImGui::PopItemWidth();
ImGui::End();
}
}
Компиляция этот файл с остальной частью моего проекта я получаю окно, которое выглядит как этот
https://s4.postimg.org/cyrdl2p8d/DMUX_130.png
Как вы можете видеть, что это не печатает из всего содержимого константным полукокса * * как это должно. Но заявления COUT правильно распечатав содержимое массива, который должен быть
- "El Camino"
- "Moscovitch"
- "ElCamino"
без кавычек, это становится первое значение правильно, как показано на рисунке. Есть ли что-то неправильное, что я делаю с инициализацией переменной имен? SizeOf странно из-кода в imgui_demo.cpp IMGUI в его использовали этот макрос для SizeOf на ListBoxes
Так что я просто взял необработанный ввод, а не с помощью определения.
Подсказка: что такое 'sizeof (names)'? –
Попробуйте создать MCVE, который иллюстрирует вашу проблему. В коде, который вы опубликовали, так много несвязанных крутизны, что вы вряд ли можете ожидать, что кто-то еще пробирается, чтобы найти вашу проблему, если вы не беспокоили себя. В процессе вырезания ненужного материала у вас может быть «ага!». момент и решить для себя, в чем проблема. Если нет, у других людей будет шанс сразиться с вами. – Peter
Если бы я предложил минимальный пример; то это просто привлечет меня к содержимому указанного const char **, о котором я уже упоминал, работает правильно, проблема заключается в коде GUI, поэтому я включил это в свой вопрос. – bkeys