2010-08-14 66 views
0

我試圖讀取一個Xml文件遞歸地使用Tinyxml,但是當我嘗試訪問數據時,我得到一個「分段錯誤」。這裏是代碼:使用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);  

出於某種原因,這三個「如果」行拋出我的分段錯誤,但我已經不是哪裏出了問題的想法。

在此先感謝。

+0

它看起來像你檢查如果ingrediente!= NULL在第三,如果但不是在前兩個。如果ingrediente真的是空的,那麼前兩個if會拋出一個分段錯誤。你應該用調試器打開它,以確定什麼是NULL。 – Pace 2010-08-14 00:05:12

+0

如果您發佈一個完整的代碼,您會得到一個精確的答案,並且不要忘記使用「代碼」標籤,以便正確格式化。我建議你編輯。 – Poni 2010-08-14 00:18:40

+0

如果你發佈你正在解析的XML的「迷你版本」,你會做得更好。 – Poni 2010-08-14 00:19:46

回答

1

在每次迭代開始時,Your're正在更新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"))) 

重要的一點是讓指針後檢查空,並取消引用前。