У меня есть такая структура:
struct BaseLayerComponent {
//Info
int posX = -99999;
int posY = -99999;
//Texture
std::string textureName = NULL_STR;
std::string localTexture = NULL_STR;
std::string remoteTexture = NULL_STR;
std::string remoteTextureParent = NULL_STR;
};
Это хранится в пользовательском классе массива (На самом деле хранятся указатели этой структуры).
Класс, который в основном использует его, это WD_MainWorld , которые наследуются от WD_2DWorld
Эти два класса имеют вызов функции Init (), в этой функции создается BaseLayerComponent , затем мы сохраняем ссылка этого последнего в сетку (пользовательский массив).
Но позже, когда я хочу использовать его, в другой функции у меня возникает странная ошибка (функция отладки - это пользовательская функция, созданная для отладки):
systems->ErrSys->Debug(layer0.Grid[X][Y]->textureName);
systems->ErrSys->Debug(layer0.Grid[X][Y]->remoteTexture);
Здесь первый работает отлично, НО второй дает мне нарушение чтения прав доступа (Обратите внимание, что я также протестировал его с remoteTextureParent , но та же проблема).
Итак, для целей отладки я создал функцию show:
virtual void show() {
systems->ErrSys->Debug(layer0.Grid[0][0]->remoteTexture);
}
И после долгого исследования я обнаружил, где он начал давать ошибки:
это в конце функции Init родительский класс (последний вызов);
show();
return true;
}
здесь show () работает отлично, НО, когда мы оставляем функцию, она перестает работать:
if (!world->Init())
{
systems->LastErrMsg = "Main World can't be initialized";
ErrSubmit(systems->ErrSys, EXO::ERR::LOG_TYPE::ERR, ERR_MAIN_WORLD_INIT, systems->LastErrMsg, "Main World Class - Can't be Initialized");
return false;
}
else
world->show();
Помните, что textureName все еще работает, и у меня есть проверенный указатель все еще работает (все тот же адрес).
Спасибо, заранее.
ОБНОВЛЕНИЕ:
Я изменил функцию show, чтобы проверить все:
virtual void show() {
std::cout << layer0.Grid[0][0] << std::endl;
std::cout << layer0.Grid[0][0]->posX << std::endl;
std::cout << layer0.Grid[0][0]->posY << std::endl;
systems->ErrSys->Debug(layer0.Grid[0][0]->localTexture);
systems->ErrSys->Debug(layer0.Grid[0][0]->textureName);
systems->ErrSys->Debug(layer0.Grid[0][0]->remoteTextureParent);
systems->ErrSys->Debug(layer0.Grid[0][0]->remoteTexture);
}
и вот результат:
До конца Init ():
0073EED8
0
0
src/World/DGI_New_Tile_Normal.png
DGI_New_Tile_Normal.png
http://rpg.exodiastudio.com/
TEMP/World/Main/Textures/DGI_New_Tile_Normal.png
После Init ():
0073EED8
-858993460
0
<- There is a space here
<- and here the error (which is not same as previous, see below):
Необработанный исключение в 0x756422A2 в RPGBoards.exe: исключение Microsoft C ++: std :: bad_allo c в ячейке памяти 0x0073E784.
ОБНОВЛЕНИЕ 2 (для Jabberwocky):
Инициализация в WD_MainWorld : // Сначала мы создаем мир EGE в главном интерфейсе (используя соединение) EXO :: IO :: INTERFACES_GAME_TYPE Тип = EXO :: IO :: INTERFACES_GAME_TYPE :: GM;
//Creating Builder (What world need);
EXO::TREATEMENT::WORLD::World_Builder Builder;
Builder.background = "black";
Builder.isMovable = true;
//Sending all textures
systems->FTP->CreateFolder(root, 0);
systems->FTP->CreateFolder(root + "Main", 0);
systems->FTP->CreateFolder(root + "Main/Textures", 0);
//Creating default tile
EXO::TREATEMENT::WORLD::BaseLayerComponent comp;
comp.posX = 0;
comp.posY = 0;
comp.localTexture = "src/World/DGI_New_Tile_Normal.png";
comp.textureName = "DGI_New_Tile_Normal.png";
//First we update the online texture path
comp.remoteTexture = root + "Main/Textures/" + comp.textureName;
comp.remoteTextureParent = "http://rpg.exodiastudio.com/";
//now we send texture
bool isDone = false;
systems->FTP->SendFile(comp.localTexture, comp.remoteTexture, 0, &isDone);
while (!isDone);
Builder.baseLayerComponents.push_back(comp);
AddTile(comp);
systems->connection->CallFunction("AddWorld", &Type, &Builder);
show();
return WD_2DWorld::Init();
Инициировать в родительский класс WD_2DWorld :
//First we check if systems are active because the class need it
if (systems == nullptr || GC == nullptr)
return false;
//Creating all layers
for (int i = 1; i <= 9; i++) {
EXO::TREATEMENT::WORLD::Layer newLayer;
newLayer.layerLevel = i;
layers.push_back(newLayer);
}
//set has initialized and return
classInitialized = true;
return true;