RapidXml Работает при сборке, но возникают проблемы в отладчике

Привет, я использую rapidxml для загрузки карты в своей игре, вот как мой класс для загрузки выглядит так, как будто он обычно компилируется, но при загрузке файла иногда происходит сбой, поэтому я хотел его отладить, но отладчику не нравится моя функция, которая устанавливает указатели на данные в файле xml .

#0 0042D5A6 rapidxml::xml_node<char>::first_node(this=0x0, name=0x484175 <_ZSt16__convert_from_vRKPiPciPKcz+4735349> "MapInfo", name_size=7, case_sensitive=true) (C:/.../rapidxml.hpp:942)
#1 00404E31 MapLoader::SetNodes(this=0x27fc1c) (C:\...\main.cpp:651)
#2 004032F6 main() (C:\...\main.cpp:267)


class MapLoader
{
public:
xml_document<> doc;
file<>xmlFile(char);
string ca,cb,cc,cd;

xml_node<> *test;

xml_node<> *root;
    xml_node<> *mapinfo;
        xml_node<> *name;
        xml_node<> *date;
        xml_node<> *msize;
            xml_attribute<> *sizex;
            xml_attribute<> *sizey;
    xml_node<> *mapdata;
        xml_node<> *layer;
            xml_attribute<> *nr;
                xml_node<> *tile;
                    xml_attribute<> *id;
                    xml_attribute<> *x;
                    xml_attribute<> *y;

void LoadFile(const char *filename);
void SetNodes();
void FillVector();
void SaveVector();
};

void MapLoader::SetNodes()
{
    root=doc.first_node("root");
        mapinfo=root->first_node("MapInfo");   //////debugger is pointing on this line
            name=mapinfo->first_node("Name");
            date=mapinfo->first_node("Date");
            msize=mapinfo->first_node("Size");
                sizex=msize->first_attribute("x");
                sizey=msize->first_attribute("y");
        mapdata=root->first_node("MapData");
            layer=mapdata->first_node("Layer");
                nr=layer->first_attribute("id");
                    tile=layer->first_node("Tile");
                        id=tile->first_attribute("id");
                        x=tile->first_attribute("x");
                        y=tile->first_attribute("y");
}

что я могу сделать, чтобы восстановить его или что-то в этом роде?

Изменить: вот мой xml-файл:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <MapInfo>
        <Name>Test</Name>
        <Date>17.08.2014</Date>
        <Size x="64" y="64"/>
    </MapInfo>
    <MapData>
        <Layer nr="1">
            <Tile id="1" x="32" y="32"/>
            <Tile id="1" x="32" y="64"/>
            <Tile id="1" x="512" y="64"/>
        </Layer>
        <Layer nr="2"/>
        <Layer nr="3"/>
    </MapData>
</root>

person davido132    schedule 18.08.2014    source источник
comment
Вы можете изменить свой код, чтобы он был более читабельным!   -  person Samer    schedule 19.08.2014


Ответы (1)


Прежде всего, рекомендуется проверять значение NULL в качестве возвращаемого указателя. Я предполагаю, что "root" отсутствует в файле xml.

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

Редактировать:

Я написал небольшую программу и проверил как минимум Name и Date. Работает на меня.

// Trying out rapid xml.
//
#include "rapidxml/rapidxml.hpp"
#include <cstdio>
#include <string>
#include <vector>

int main(int argc, char** argv) {
    rapidxml::xml_document<> doc;    // character type defaults to char
    FILE* file = fopen("Test.xml", "r");
    if (!file)
        return 1;
    // file exists.
    // get the number of bytes.
    fseek(file, 0, SEEK_END);
    size_t sizeInBytes = ftell(file);
    fseek(file, 0, SEEK_SET);
    char* buffer = static_cast<char*>(malloc(sizeInBytes + 1));  // + 1 needed?
    if (fread(buffer, 1LU, sizeInBytes, file) != sizeInBytes) {
        perror("unexpected file length\n");
        fclose(file);
        free(buffer);
        return 1;
    }
    buffer[sizeInBytes] = 0;
    // close the file.
    fclose(file);
    doc.parse<0>(buffer);        // 0 means default parse flags
    std::vector<std::string> nodeNames;
    nodeNames.push_back("Name");
    nodeNames.push_back("Date");
    rapidxml::xml_node<>* node = doc.first_node("root");
    for (size_t i = 0; i < nodeNames.size() && node; ++i) {
        if (node->first_node(nodeNames[i].c_str()))
            fprintf(stderr, "CantFindNode with name %s.\n", nodeNames[i].c_str());
        printf("Node %s found!\n", nodeNames[i].c_str());
    }
    free(buffer);
    return 0;
  }
person CantTouchDis    schedule 18.08.2014
comment
все указатели что-то возвращают, когда флаг case_sensitive выключен, ничего не меняется и root остается на своем месте. - person davido132; 19.08.2014
comment
Взгляните на мою редакцию. Я не уверен, где ваш код ломается, но это может вам помочь. - person CantTouchDis; 19.08.2014
comment
Я обнаружил, что это происходит, когда я использую класс для работы с узлами, если я добавляю тот же код без класса, он работает, и отладчик не останавливается на этой фазе кода, я попытаюсь спроецировать свой код без класса, спасибо за помощь - person davido132; 19.08.2014
comment
Зачем использовать C I/O и malloc/free, когда вы должны писать на C++?? - person Roddy; 14.09.2014
comment
Its a bit of a habit of me to use C I/O. I also lint all my files using googles cpplint со своим Руководством по стилю. Но я не думаю, что это улучшит этот ответ. Не стесняйтесь редактировать его. - person CantTouchDis; 14.09.2014