2012-06-20 3 views
0

Я недавно начал использовать tinyXML. Проблема в том, что когда я запускаю свою программу для чтения через xml, она возвращает обратно нарушение доступа. Обычная линия:Нарушение прав доступа к TinyXML

doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText() 

С Отладчиком Visual Studio, я решил, что она возвращается нулем для «Карты», а затем использует пустую ссылку для вызова функций.

Вот первые строки кода, и XML

XMLDocument doc; 
    doc.LoadFile(path.c_str()); 

    int width = atoi(doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText()); 

XML:

<?xml version="1.0"?> 
<Master> 
<Map> 
    <Width>5</Width> 
    <Height>5</Height> 
    <Layers>1</Layers> 
    <Tiles> 
     <Tile> 
      <Id>1</Id> 
      <Path>data/tiles/dirt-base.png</Path> 
     </Tile> 
    </Tiles> 
    <Data> 
     <DataLayer>1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1</DataLayer> 
    </Data> 
</Map> 
</Master> 

IT важно отметить, я изначально не имеют корневой тег, но добавил, когда это не сработало, добавив, что это все равно не помогло. Любая помощь была бы оценена

+0

Что возвращает 'doc.LoadFile (...)' return? –

+0

Никогда не используйте указатели, возвращаемые функциями, не проверяя, что они возвращают ненулевые указатели. –

+0

Существует ли «путь»? – acraig5075

ответ

0

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

3

изменение

int width = atoi(doc.FirstChildElement("Map")->FirstChildElement("Width")->GetText()); 

в

int width = atoi(doc.FirstChildElement("Master")->FirstChildElement("Map")->FirstChildElement("Width")->GetText()); 

он работает на моем компьютере использовать новейшую TinyXML.

согласно TinyXML документации

вы должны сначала проверить LoadFile вернуть

if (!_doc.LoadFile(filename)) 
{ 
    printf("load file=[%s] failed\n", filename); 
    return -1; 
} 

затем проверить элемент существует, чтобы избежать нарушения прав доступа.

Прост в использовании TiXmlHandle для проверки элемента.

TiXmlHandle docHandle(&doc); 
TiXmlElement* child = docHandle.FirstChild("Map").FirstChild("Width").ToElement(); 
if (child) 
{ 
    // do something useful 
1

Как вы сказали в комментариях вашего вопроса, код ошибки 3 file not found Вы имеете более чем вероятно, отсортированный это, но частой причиной этого является просто получение слеша пути неправильный путь вокруг.

У меня была эта точная проблема. Сделав справедливую часть веб-разработки, среда, в которой косые черты находятся в разных направлениях внутри одного и того же проекта, из-за того, что происходит фанк различных сценариев/разметки/серверной стороны/клиентской стороны (и где вам иногда нужно изменить направление из половины ваших слэшей при публикации!), это очень много. Я все еще был в шоке в течение хорошего часа.

Придерживаясь этого возможного решения поздно для справки - это самый известный результат Google на TinyXML и эта проблема.