ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
F#とIronPythonのRTCのプログラムですが、色々おかしかったので修正しました。
F#やIronPythonで実装した方がいい時もあるかもしれないです。
C++、Python、Java、C#、VB.net、C++/CLI、Scala、Erlang、Jython、F#、IronPythonで
動くRTCは見たことがありますけど、それ以外にも何かあるかもしれないです。
さっき気付いたのですけど、InPortPushConnectorクラスとOutPortPushConnectorクラスのコンストラクタでプロバイダ(例:InPortCorbaCdrProvider)とコンシュマー(例:InPortCorbaCdrConsumer)のinit関数が呼び出されているのですが、何故かInPortPullConnectorクラスとOutPortPullConnectorクラスのコンストラクタではプロバイダ(例:OutPortCorbaCdrProvider)とコンシュマー(例:OutPortCorbaCdrConsumer)のinit関数は呼び出されていません。
Push型に設定したときにInPortCorbaCdrProviderクラスやInPortCorbaCdrConsumerクラスのinit関数は、InPortBaseクラスのcreateConsumer関数とcreateProvider関数で呼び出す分も含めて2回実行するわけですが、Pull型に設定したときにOutPortCorbaCdrProviderクラスやOutPortPullConnectorクラスのinit関数は何故か1回しか呼び出されていないのでかなり混乱しました。
C++版でもPython版でもこうなっているので仕様かもしれないです。
文字数が多くなったので簡単に言うと、Push型の場合はプロバイダ、コンシュマーのinit関数が2回呼ばれますけど、Pull型では1回しか呼び出されないというだけです。
それから独自の通信を実装してプロバイダ、コンシュマーのファクトリへの登録を行うと、RTシステムエディタで接続するときに何故かInterface_typeの選択肢が増殖します。
これはOutPortBaseクラスのinitProviders関数、initConsumers関数でappendProperty関数を使ってプロパティを追加するわけですが、appendProperty関数内部ではNVUtilのappendStringValue関数を使用しています。
initProviders関数、initConsumers関数でappendProperty関数の引数には、
corba_cdr, shared_memory, direct
のようにコンマで区切った文字列が渡されるわけですが、これがそのままappendStringValue関数に渡されています。
appendStringValue関数内部では現在のプロパティの値をコンマで分割した各文字列と新規に追加する文字列を比較するわけですが、上記のような文字列を直接入力すると正常に比較ができません。
例えば、
事前にあるプロパティにこういう値が入力されているとします。
test1, test2, test3
そして、新たに以下の要素を追加しようとします。
test1, test4, test3
すると以下の文字列同士の比較を行って、一致した場合は追加しないようにします。
まあ別にこの現象が起こっても困るわけではないので、あまり気にする事もないかもしれないです。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
F#やIronPythonで実装した方がいい時もあるかもしれないです。
C++、Python、Java、C#、VB.net、C++/CLI、Scala、Erlang、Jython、F#、IronPythonで
動くRTCは見たことがありますけど、それ以外にも何かあるかもしれないです。
さっき気付いたのですけど、InPortPushConnectorクラスとOutPortPushConnectorクラスのコンストラクタでプロバイダ(例:InPortCorbaCdrProvider)とコンシュマー(例:InPortCorbaCdrConsumer)のinit関数が呼び出されているのですが、何故かInPortPullConnectorクラスとOutPortPullConnectorクラスのコンストラクタではプロバイダ(例:OutPortCorbaCdrProvider)とコンシュマー(例:OutPortCorbaCdrConsumer)のinit関数は呼び出されていません。
Push型に設定したときにInPortCorbaCdrProviderクラスやInPortCorbaCdrConsumerクラスのinit関数は、InPortBaseクラスのcreateConsumer関数とcreateProvider関数で呼び出す分も含めて2回実行するわけですが、Pull型に設定したときにOutPortCorbaCdrProviderクラスやOutPortPullConnectorクラスのinit関数は何故か1回しか呼び出されていないのでかなり混乱しました。
C++版でもPython版でもこうなっているので仕様かもしれないです。
文字数が多くなったので簡単に言うと、Push型の場合はプロバイダ、コンシュマーのinit関数が2回呼ばれますけど、Pull型では1回しか呼び出されないというだけです。
それから独自の通信を実装してプロバイダ、コンシュマーのファクトリへの登録を行うと、RTシステムエディタで接続するときに何故かInterface_typeの選択肢が増殖します。
これはOutPortBaseクラスのinitProviders関数、initConsumers関数でappendProperty関数を使ってプロパティを追加するわけですが、appendProperty関数内部ではNVUtilのappendStringValue関数を使用しています。
initProviders関数、initConsumers関数でappendProperty関数の引数には、
corba_cdr, shared_memory, direct
のようにコンマで区切った文字列が渡されるわけですが、これがそのままappendStringValue関数に渡されています。
appendStringValue関数内部では現在のプロパティの値をコンマで分割した各文字列と新規に追加する文字列を比較するわけですが、上記のような文字列を直接入力すると正常に比較ができません。
例えば、
事前にあるプロパティにこういう値が入力されているとします。
test1, test2, test3
そして、新たに以下の要素を追加しようとします。
test1, test4, test3
すると以下の文字列同士の比較を行って、一致した場合は追加しないようにします。
- "test1"と"test1, test4, test3"
- "test2"と"test1, test4, test3"
- "test3"と"test1, test4, test3"
まあ別にこの現象が起こっても困るわけではないので、あまり気にする事もないかもしれないです。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
PR
この記事にコメントする