Ошибка сегментации с использованием Tinyxml - PullRequest
0 голосов
/ 14 августа 2010

Я пытаюсь рекурсивно прочитать файл XML с помощью Tinyxml, но когда я пытаюсь получить доступ к данным, я получаю «Ошибка сегментации». вот код:

int id=0, categoria=0;
const char* nombre;
do{  
    ingrediente = ingrediente->NextSiblingElement("Ingrediente");   
    contador++;  
    if(ingrediente->Attribute("id")!=NULL)
        id = atoi( ingrediente->Attribute("id") );  
    if(ingrediente->Attribute("categoria")!=NULL)
        categoria = atoi ( ingrediente->Attribute("categoria") );  
    if(ingrediente!=NULL)
        nombre = ( ( ingrediente->FirstChild() )->ToText() )->Value();  
}while(ingrediente);    

По какой-то причине три строки «если» приводят меня к ошибке сегментации, но я не знаю, в чем проблема.

Заранее спасибо.

1 Ответ

1 голос
/ 14 августа 2010

Вы обновляете ingrediente в начале каждой итерации, а затем разыменовываете его перед проверкой, что оно не равно нулю. Это даст ошибку сегментации, если она равна нулю. Цикл, вероятно, должен быть структурирован по линии

for (ingrediente = first_ingrediente; 
     ingrediente; 
     ingrediente = ingrediente->NextSiblingElement("Ingrediente"))
    contador++;  
    if(ingrediente->Attribute("id"))
        id = atoi( ingrediente->Attribute("id") );  
    if(ingrediente->Attribute("categoria"))
        categoria = atoi ( ingrediente->Attribute("categoria") );  
    nombre = ingrediente->FirstChild()->ToText()->Value();  
}

Извините за смешивание английского языка с именами переменных; Я не говорю по-испански.

Или, если NextSiblingElement дает вам первый элемент при начале итерации, for можно заменить на while:

while ((ingrediente = ingrediente->NextSiblingElement("Ingrediente")))

Важным моментом является проверка на нулевое значение после получения указателя и перед разыменованием его.

...