バグ #1562
完了
サービスポートのサーバントクラスのメソッドの宣言に関する問題
kurihara さんが14年以上前に追加.
ほぼ13年前に更新.
説明
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が固定長構造体かそうでないかによっても変わるため注意が必要。)
ファイル
sequence型をin,outで使用した場合にも問題あり。
以下、パラメータにsequeceが使用された場合のC++マッピング。
typedef sequence<float> ValueList;
sequenceがinパラメータの場合: const ValueList& (RTCBで生成されるコード: EchoList )
sequenceがoutパラメータの場合: ValueList_out (RTCBで生成されるコード: EchoList& )
引数および戻り値は、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++マッピングには対処できません。
- 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内の記述以外には見つけられなかった。
- ステータス を 新規 から 解決 に変更
- 担当者 を ta にセット
- 進捗率 を 0 から 100 に変更
他の形式にエクスポート: Atom
PDF