Я пишу программу на 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
'char * childrenCurrent [32];'? Я бы пошел с 'vector'. Во всяком случае, я не знаю реализацию pugixml, но после каждой итерации 'attributeCurrent' уничтожается, я не знаю, остается ли указатель на его значение, полученное с помощью' child_value() '(вы получили копию каждого узла? A копия ссылки на ее внутреннюю реализацию?). Что бы это ни было, если вы используете 'vector ', у вас будет _safe_ копия его значения. Чтобы сохранить свой фактический код, вы должны использовать 'strdup' вместо' strcpy'. –
«Ошибка сегментации» предполагает, что ваш цикл 'for' выполняет больше времени, чем позволяет' childrenCurrent [numberAttributesC] '. Убедитесь, что 'numberAttributesC' никогда не превышает' Max size childrenCurrent - 1'. –