Corba序列由于stringstream.str()。c_str()错误导致的任何提取失败

时间:2014-02-26 20:34:51

标签: sequence corba stdstring any tao

IDL文件定义了一个序列,其元素是IPCParams类型。

module project{
  struct IPCParams{
     string ipcSetId;
     any params;  
  };

 typedef sequence<IPCParams> Params;
};

我的示例代码(它是在带有ACE_TAO的VS08中开发的)如下:

    project::Params  params(4);
    params.length(4);
    for(int i=0; i<4;i++){
        project::IPCParams ipcP;

        std::stringstream sstm("");
        sstm <<"ipcid-" << " "<<i;
        std::string val = sstm.str();
        ipcP.ipcSetId = val.c_str();

        std::stringstream xxxx("");
        xxxx <<" paramters " << i ;
        val = xxxx.str();
        std::cout<<" str: "<<val.c_str()<<"  || "<<val <<"||" <<std::endl;
        ipcP.params <<= CORBA::Any::from_string(val.c_str(),100);
        params[i] = ipcP;
    }

    CORBA::Any any;
    any<<=params;

    project::Params* params_out;
    any >>= params_out;
    //CORBA::Boolean flag = ttt->release();
    project::IPCParams* ipcPtr = params_out->get_buffer();
    for(int i=0; i< params_out->length(); i++){
             // change ipcPtr[i] = > params_out[i] would cause   error C2440: 'initializing' : cannot convert from 'project::Params' to 'project::IPCParams' 
        project::IPCParams ipcp = ipcPtr[i];
        const char*  realVal;
        ipcp.params >>= CORBA::Any::to_string(realVal,100);

        std::cout<<" id: "<<ipcp.ipcSetId <<"  anyValue: "<< realVal <<std::endl;
    }

}

上面的代码试图将project :: params(一系列IPCParams)插入到任何对象中,然后从这个对象中提取所有值。 IPCParams的一个成员也是任何对象,我只是在其中插入一个字符串。

这里的两个问题是:

  • 除了使用dynamicAny或get_buffer之外,还有其他方法可以提取序列信息。

  • IPCParams :: params值的执行结果错误,这是任何类型。 输出结果如下:

Calling test Params...
 str:  paramters 0  || ||004CF928
 str:  paramters 1  || ||004CF928
 str:  paramters 2  || ||004CF928
 str:  paramters 3  || ||004CF928
  Arg name: Params
 id: ipc id 0  anyValue:   -004CF7AC
 id: ipc id 1  anyValue:   -004CF7AC
 id: ipc id 2  anyValue:   -004CF7AC
 id: ipc id 3  anyValue:   -004CF7AC

显然,str在行

        const char* str = xxxx.str().c_str();      // Q2: str is blank??

在插入部分的循环中指向一个空字符串(它应该是非空白的)。我无法解释为什么

xxxx.str()。c_str()=&gt;纠正字符串

str =&gt;空白..

有人可以帮忙吗?提前致谢。


使用C ++进行高级CORBA编程时使用序列*的两个*规则:

1-避免对复杂类型的元素使用数据构造函数。 2-除非你真的,否则不要使用数据构造函数或缓冲区操作函数 需要。

从Any中提取值后,我尝试使用以下方法获取第i个元素:

            project::IPCParams ipcp = params_out[i];

而不是

            project::IPCParams* ipcPtr = params_out->get_buffer()
            project::IPCParams ipcp = ipcPtr[i];

但编译失败,因为您可以在注释中看到错误消息。

0 个答案:

没有答案