プロジェクト

全般

プロフィール

バグ #1562

サービスポートのサーバントクラスのメソッドの宣言に関する問題

kuriharaほぼ14年前に追加. 約12年前に更新.

ステータス:
終了
優先度:
通常
担当者:
対象バージョン:
-
開始日:
2010/06/03
期日:
進捗率:

100%

予定工数:

説明

IDLファイルにてstructを扱うオペレーションを定義した場合、RTCBにて生成されるコードに不具合があり、コンパイルエラーとなる。

以下は、メーリングリスト[openrtm-users 01258]にて報告された内容を引用。

たとえば,以下のidlファイルに対して,
--------------------------------
struct Frame {
  double mat[3][3];
  double pos[3];
};

interface ComFk {
  void set_tool(in Frame frm);
};
---------------------------------
RTCBuilderでは,スケルトンのテンプレート xxxx_impl.h で

   void set_tool(Frame frm);

のようなコードが生成されます.本来これは

   void set_tool(const Frame& frm);

となるべきだと思います.

なお、この件については、戻り値とoutパラメータがstructの場合にも不具合がある。
(戻り値とoutパラメータは、structが固定長構造体かそうでないかによっても変わるため注意が必要。)

履歴

#1 kuriharaほぼ14年前に更新

sequence型をin,outで使用した場合にも問題あり。

以下、パラメータにsequeceが使用された場合のC++マッピング。

typedef sequence<float> ValueList;

sequenceがinパラメータの場合: const ValueList& (RTCBで生成されるコード: EchoList )
sequenceがoutパラメータの場合: ValueList_out   (RTCBで生成されるコード: EchoList& )

#2 n-andoほぼ14年前に更新

引数および戻り値は、CORBA C++マッピングに規定されている通りに適切な修飾子や'&'、あるいは引数専用の_out型に変換してやる必要がある。
特に、構造体は、バウンデッドとアンバウンデッドで分ける必要がある。アンバウンデッドは、以下のケースで、それ以外はバウンデッドな構造体である。

*バウンディッド文字列またはアンバウンディッド文字列
*バウンディッド・シーケンスまたはアンバウンディッド・シーケンス
*可変長メンバを含む構造体または共用体
*可変長の要素型を持つ配列
*可変長型への typedef

詳細は、C++ Language Mapping Specification formal/03-06-03 のp.122くらい、1.22.1 Operation Parameters and Signatures を参照のこと。

坂本さんへ、ソースをちょっと見てみましたが、引数に関する情報を保持しているオブジェクトには、型の文字列名称とdirectionしか保持されておらず、CXXConverter.java の簡単なコードだけではCORBAのC++マッピングには対処できません。

#3 n-andoほぼ14年前に更新

  • ServiceArgumentParam オブジェクトが引数の情報を保持するクラス。フィールドは以下の通り。
    *private String type;
    *private String name;
    *private String direction;
    *IDLParamConverter::convert() 内で、ServiceArgumentParam を生成している。
    *上記フィールドをそれぞれNodeに基づいてセットしている。
    *Nodeは構文木の一部で、たどることで型情報を取得できる。例えば、以下のようにするとNodeのkindが37番(float)の場合に"bounded"文字列がセットされたStringを受け取ることが可能。
    public static String boundedAttr(Node n) {
        final StringBuffer result = new StringBuffer();
        n.accept(new GJNoArguDepthFirst() {
            @Override
            public Object visit(NodeToken n) {
                if (n.kind == 37) {
                    result.append("bounded");
                }
                return result;
            }
        });
        return result.toString();
    }

*kindの番号と型の対応関係はIDLParse.java内の記述以外には見つけられなかった。

#4 taほぼ14年前に更新

  • ステータス新規 から 解決 に変更
  • 担当者ta にセット
  • 進捗率0 から 100 に変更

修正させて頂きました rev141

#5 n-ando約12年前に更新

  • ステータス解決 から 終了 に変更

他の形式にエクスポート: Atom PDF