动态分配的聊天数组打印缺失的数据和空

dynamically allocated chat array prints missing data & empty

本文关键字:数据 打印 聊天 数组 动态分配      更新时间:2023-10-16

我正在使用xerces解析XML并构建一个以后可以遍历的内部结构。

作为此解析的一部分,我遇到了数量可变的<Field_Delimited>元素,如下所示:

<Field_Delimited>
<name>some_value</name>
<data_type>ASCII_Real</data_type>
<unit>some_value</unit>
<description>some_value</description>
</Field_Delimited>

内存中称为file_observational_area的结构将表示这些字段,在文件级别全局声明,请参阅相关代码段,最相关的方法是get_data((

file_observational_area * _file_observational_area = NULL;
int main(int argc, char* args[]) {
//pass in as console argument 
char* xmlFile = args[1];
//initialize  file_observational_area
_file_observational_area = allocate_file_observational_area(_file_observational_area, 1);
//actual data
field_data_value * _field_data_values_array = NULL;
try {
parser->parse(xmlFile);
DOMDocument* dom = parser->getDocument();
DOMNodeList * dom_node_list = dom->getChildNodes();
for (unsigned int i = 0; i < dom_node_list->getLength(); i++) {
walk_DOM(dom_node_list->item(i), _file_observational_area);
}
get_data(_file_observational_area, xmlFile, 0, 0, 0, _field_data_values_array);

} catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: n"
<< message << "n";
XMLString::release(&message);
return -1;
}
}

walk_dom(( 相关代码段,它调用 parse_dom((:

void walk_DOM(DOMNode * dom_node, file_observational_area * _file_observational_area) {

if (_file_observational_area) {
_file_observational_area = parse_dom(dom_node, _file_observational_area);
}

parse_dom(( 函数相关代码段:

/*<Field_Delimited>*/
if (XMLString::equals(currentElement->getNodeName(), XMLString::transcode("Field_Delimited"))) {
/*<Field_Delimited>
<name>enc4</name>
<data_type>ASCII_Real</data_type>
<unit>rad</unit>
<description>Joint 4 encoder counts [RA_DOF]</description>
</Field_Delimited>*/
/*<Field_Delimited>*/
XMLCh* tag_Field_Delimited_name = XMLString::transcode("name");
string tag_Field_Delimited_name_val;
XMLCh* tag_Field_Delimited_data_type = XMLString::transcode("data_type");
string tag_Field_Delimited_data_type_val;
XMLCh* tag_Field_Delimited_unit = XMLString::transcode("unit");
string tag_Field_Delimited_unit_val;
XMLCh* tag_Field_Delimited_description = XMLString::transcode("description");
string tag_Field_Delimited_description_val;
DOMElement * field_delimited_element = NULL;
cout << "<Field_Delimited> DETECTEDn";

DOMNode * child = currentElement->getFirstElementChild();

while (NULL != child) {

if (DOMNode::ELEMENT_NODE == child->getNodeType()) {
if (XMLString::equals(tag_Field_Delimited_name, child->getNodeName())) {
  _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());
  //strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name, XMLString::transcode(child->getTextContent()));
  cout << "Debug: tag_Field_Delimited_name_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name << "n";
}
if (XMLString::equals(tag_Field_Delimited_data_type, child->getNodeName())) {
  _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type = XMLString::transcode(child->getTextContent());
  //strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type, XMLString::transcode(child->getTextContent()));
 cout << "Debug: tag_Field_Delimited_data_type_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].data_type << "n";
}
if (XMLString::equals(tag_Field_Delimited_unit, child->getNodeName())) {
  _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit = XMLString::transcode(child->getTextContent());
  // strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit, XMLString::transcode(child->getTextContent()));
  cout << "Debug: tag_Field_Delimited_unit_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].unit << "n";
}
if (XMLString::equals(tag_Field_Delimited_description, child->getNodeName())) {
  _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description = XMLString::transcode(child->getTextContent());
   //strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description, XMLString::transcode(child->getTextContent()));
  cout << "Debug: tag_Field_Delimited_description_val:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].description << "n";
}
}

child = child->getNextSibling();
}//end while <Field_Delimited> has siblings
}//end  /*<Field_Delimited>*/

}

日志显示parse_dom()Im 能够通过XMLString::transcode(child->getTextContent())获取正确值的预期行为,并使用_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());设置值

问题:但是,在void get_data()中,char 的值丢失或损坏,请参阅相关代码段

for (int field_record_index = 0; field_record_index < _file_observational_area->_table_delimited->_record_delimited->fields; field_record_index++) {
if (NULL != _file_observational_area->_table_delimited->_record_delimited->_field_delimited) {
cout << "<Field_Delimited> number:" << field_record_index << "n";
//MISSING or corrupted name
cout << "name :" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].name << "n";
//MISSING or corrupted datatype
cout << "data_type:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].data_type << "n";
//MISSING or corrupted unit
cout << "unit:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].unit << "n";
//MISSING or corrupted description 
cout << "description:" << _file_observational_area->_table_delimited->_record_delimited->_field_delimited[field_record_index].description << "n";
                                                          }

这就是我为动态字符串分配内存的方式:

/*=============================================================================
Function        malloc_field_delimited
Description:    allocated memory for _record_delimited->_field_delimited
*                  dynamic array 
References:       
Inputs:         
Output:            
==========================================================*/
field_delimited * malloc_field_delimited(field_delimited * _field_delimited, int number_of_fields) {
_field_delimited = (field_delimited*) malloc(sizeof (field_delimited) * number_of_fields);
field_delimited * field_delimited_ptr = _field_delimited; 
if (_field_delimited) {
for (int i = 0; i < number_of_fields; i++) {
(field_delimited_ptr + i)->name = (char *)  malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->data_type = (char *)  malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->description = (char *)  malloc(sizeof (char) * 256);
(field_delimited_ptr + i)->unit = (char *)  malloc(sizeof (char) * 256);

}
} else {
printf("malloc_field_delimited(), unable to allocate memory, exiting!");
exit(1);
}
return _field_delimited;
}

我也尝试使用memset()但它没有用,同样的问题。

为什么 get_data(( 中的字符值丢失以及如何解决此问题?

我想坚持通过char *使用动态分配的字符串,而不是使用字符串。

谢谢一百万!

_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());

您正在覆盖指针,丢失之前分配的内存。 您应该改用 strcpy。

strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name, XMLString::transcode(child->getTextContent()));