首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态分配的聊天数组打印丢失的数据&空

动态分配的聊天数组打印丢失的数据&空
EN

Stack Overflow用户
提问于 2020-02-05 02:46:46
回答 1查看 45关注 0票数 0

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

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

代码语言:javascript
复制
<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()

代码语言:javascript
复制
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():

代码语言:javascript
复制
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()函数相关片段:

代码语言:javascript
复制
 /*<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> DETECTED\n";


                                                            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() 的预期行为,我可以通过 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的值丢失或损坏,请参阅相关片段**:

代码语言:javascript
复制
                                                            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";

                                                                                                                                }

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

代码语言:javascript
复制
 /*=============================================================================
    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值丢失&我如何解决这个问题?

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

多谢百万!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-05 07:43:09

代码语言:javascript
复制
_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name = XMLString::transcode(child->getTextContent());

您正在重写您的指针,丢失以前分配的内存。您应该使用strcpy代替。

代码语言:javascript
复制
    strcpy(_file_observational_area->_table_delimited->_record_delimited->_field_delimited[Record_Delimited_index ].name, XMLString::transcode(child->getTextContent()));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60068337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档