Проблема со структурой и указателями - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть такая структура:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...