2014-11-20 5 views
0

Я пишу программу на C++ для сравнения двух больших XML-файлов и создания файла с идентификаторами и изменениями продуктов (узлов), которые были изменены. Для этого я использую pugixml.Кастинг const char * to non const char *

Я работаю разработчиком PHP на данный момент, и прошло некоторое время с тех пор, как я использовал C++, поэтому я думаю, что я пропускаю что-то тривиальное, но после нескольких часов поиска в Интернете я до сих пор не нашел решение для своего Проблема заключается в следующем:

Функция child_value, которая просто дает значение между тегами элемента, возвращает const char *. То, что я пытаюсь сделать, это поместить все значения в массив и сравнить их со значениями всех других продуктов (которые находятся в аналогичном массиве).

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

Мне нужно использовать этот const char * для сравнения, но мне нужно перезаписать значения, чтобы я мог сделать следующее сравнение, что это лучший способ сделать это? Я попробовал strcpy, const_cast (как в приведенном ниже примере кода) и множество других предложений, но все, похоже, приводят к в той же ошибке сегментации.

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

for (xml_node groupCurrent = groupsCurrent.child("group");groupCurrent;groupCurrent = groupCurrent.next_sibling("group")){ 

    xml_node productsCurrent = groupCurrent.child("products"); 
    size_t nrProductsInGroupCurrent = std::distance(productsCurrent.children().begin(), productsCurrent.children().end()); 
    nrProductsTotalCurrent = nrProductsTotalCurrent + nrProductsInGroupCurrent; 

    for (xml_node productCurrent = productsCurrent.child("product");productCurrent;productCurrent = productCurrent.next_sibling("product")){ 

     int numberAttributesC=0; 
     char * childrenCurrent[32]; 

     for (xml_node attributeCurrent = productCurrent.first_child();attributeCurrent ;attributeCurrent= attributeCurrent.next_sibling()){ 
      char * nonConstValue = const_cast<char *> (attributeCurrent.child_value()); 
      childrenCurrent[numberAttributesC]=nonConstValue; 
      numberAttributesC++; 
     } 

     /*for(int i = 0;i<numberAttributesC;i++){ 
      std::cout<<childrenCurrent[i]; 
     }*/ 
     //xml_node groupsNew = docNew.child("product_database"); 

    } 
} 

Любая помощь, предложения или комментарии с благодарностью. Если я найду решение самостоятельно, я пока отправлю его здесь.

С уважением, Анти

PS: В Ubuntu с помощью GCC версии 4.8.2

+0

'char * childrenCurrent [32];'? Я бы пошел с 'vector '. Во всяком случае, я не знаю реализацию pugixml, но после каждой итерации 'attributeCurrent' уничтожается, я не знаю, остается ли указатель на его значение, полученное с помощью' child_value() '(вы получили копию каждого узла? A копия ссылки на ее внутреннюю реализацию?). Что бы это ни было, если вы используете 'vector ', у вас будет _safe_ копия его значения. Чтобы сохранить свой фактический код, вы должны использовать 'strdup' вместо' strcpy'. –

+0

«Ошибка сегментации» предполагает, что ваш цикл 'for' выполняет больше времени, чем позволяет' childrenCurrent [numberAttributesC] '. Убедитесь, что 'numberAttributesC' никогда не превышает' Max size childrenCurrent - 1'. –

ответ

0

Просто используйте vectorand string

std::vector<std::string> childrenCurrent; 

for (xml_node attributeCurrent = productCurrent.first_child();attributeCurrent ;attributeCurrent= attributeCurrent.next_sibling()) 
{  
    std::string value = attributeCurrent.child_value(); 
    childrenCurrent.push_back(value);  
} 

ПРИМЕЧАНИЕ: Я предполагаю, что child_value возвращается в const char*

string скопирует ребенка значение, которое устраняет любые проблемы с памятью, а использование vector избавит вас от необходимости беспокоиться об управлении количеством потенциальных атрибутов.

+0

Спасибо за ваши быстрые ответы, я собираюсь попробовать и дать вам знать, как это работает :) – AntiFTW

+1

Это работает, приятно, и так просто и элегантно :) Еще раз спасибо, у меня болит голова по сравнению со вчерашним днем. – AntiFTW