筑波大 木村様
産総研 安藤です
> 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 等のよう
な書き方のほうがよいと思います。
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ファイル)---