[openrtm-users 01240] Re: サービスポートにおけるデータの受信について

Ando Noriaki n-ando @ aist.go.jp
2010年 5月 24日 (月) 12:26:23 JST


筑波大 木村様

産総研 安藤です

> OpenRTM MLの皆様
>
> 筑波大学の木村と申します。
>
> プロバイダ側からコンシューマ側へ構造体ポインタを渡す際に
> Segmantation fault となってしまいデータを送ることが
> できないのですが、解決方法をご存じの方がいらっしゃいましたら
> ご教示お願いいたします。
>
>
> 今年度からubuntu8.04にてOpenaRTM-aist-1.0を利用しており、
> 現在、下記のようなidlファイルを用いてサービスポートを
> 作成中なのですが、下記のimpl.cppファイルの様な内容を記述し、
> プロバイダ側からコンシューマ側へ構造体ポインタを
> 渡す際にプロバイダ側でSegmantation fault となってしまいデータを送ることが
> できない状況にあります。
>
> 過去のメーリングリスト [openrtm-users 00795] にて類似の質問に対する
> 解決策を見つけたのですが、本件では、下記のidlファイル内容を
> 変更することなく用いたいと考えております。
>
> 勉強不足で、至らない点も多々あるかとは思いますが、ご教示して
> 頂けたら幸いです。
>
> 以下に再現用のテストで用いたidlファイル、およびimpl.cppファイル内の該当
> 部を記します。
> ---ここから(idlファイル)---
> module RTC
> {
> struct RETURN_ID
> {
> long id;
> string comment;
> };
> };
> interface ManipulatorCommonInterface_Common
> {
> RTC::RETURN_ID clearAlarms();
> };
> ---ここまで(idlファイル)---
>
> ---ここから(impl.cppファイル)---
> RTC::RETURN_ID* ManipulatorCommonInterface_CommonSVC_impl::clearAlarms()
> {
> RTC::RETURN_ID* retval;
> retval->id = 0;
> retval->comment="OK";
> return retval;
> }
> ---ここまで(impl.cppファイル)---

RTC::RETURN_ID* ManipulatorCommonInterface_CommonSVC_impl::clearAlarms()
{
  RTC::RETURN_ID* retval = new RTC::RETURN_ID();
  retval->id = 0;
  retval->comment = CORBA::String_dup("OK");
  return retval;
}

こうするとどうなりますでしょうか?

解説:
・宣言したRETURN_IDのポインタに、領域を確保せずに使用しようと
 しているので Segmentation Fault が発生します。ですので、newで
 確保する必要があります。
・CORBAの引数の受け渡し規則で、「returnした構造体など複雑なデータ型
 は、returnした先で自動的に開放される」、というのがあります。
 したがって、関数内でnewして領域を確保しても、return後にちゃんと
 解放されますので、deleteしなくても大丈夫です。

あと、好みの問題ですが、RETURN_ID のようにすべて大文字だと、
マクロと混同する人もいるので、構造体であれば ReturnID 等のよう
な書き方のほうがよいと思います。


-- 
安藤慶昭@独立行政法人産業技術総合研究所 知能システム研究部門
    統合知能研究グループ 主任研究員, 博士(工学)
    〒305-8568 つくば市梅園1-1-1 中央第2
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org

Noriaki Ando, Ph.D.
    Senior Research Scientist, RT-Synthesis R.G., ISRI, AIST
    AIST Tsukuba Central 2, Tsukuba, Ibaraki 305-8568 JAPAN
    e-mail: n-ando @ aist.go.jp, web: http://staff.aist.go.jp/n-ando
    OpenRTM-aist: http://www.openrtm.org



openrtm-users メーリングリストの案内