excitemusic

渡米生活日々の備忘録。
by lily_lila
ICELANDia
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
カテゴリ
外部ブログリンク
「渡米生活。(日記)」
もう少し日々のツブヤキに近い内容はこっちに移動しました。
プログラム関係、web関係もそのうちこちらに移します。

「the Gerden of Ethel」
我が家のウサギブログ。
ウサギは、家に連れてきて最初の2週間以内に体調を崩す可能性が高い生き物です。飼う前にご一読を!
ちょっと待って、ウサギを買う前に…
ブログパーツ
トライアルセット
その他のジャンル
記事ランキング
検索
ブログジャンル
以前の記事


<   2006年 05月 ( 5 )   > この月の画像一覧
(JAVA)ひとつ上の階層名でパッケージ宣言する??
渡米生活ブログなのにprograming tipsばかり育っている…分けるべきか??
只今、boostは一時中断してjavaのコードちまちま書いてます。まだJAVAはようわからん…
というわけで、パッケージについての疑問。こんなクラス宣言をしたとする。

package hoge.moge.mypackage;
public class MyClass {
....

このとき、javaのお約束では、MyClass.javaは厳密に hoge/moge/mypackage/ ディレクトリの直下にないといけないはずなんだけど…
実は、今書いているコードは hoge/moge/mypackage/subpackage/ の下にMyClass.javaがあるのに、コンパイルできて走ってしまったりする。
おまけに、別のサブディレクトリ hoge/moge/mypackage/anotherpackage/の下にある別のクラスAnotherClassにも同じことをやると
(つまり、パッケージの宣言をpackage hoge.moge.mypackage;とやってしまう)
import文なしでMyClassにアクセス出来ちゃったりするんですねえ…便利なことに(^^;)
(ちなみにコンパイル/実行環境はj2sdk1.4.2)

コレ、なんか問題ありそうなんだけど、まだパッケージ構造固まってないから、有り難くそのままにしています(笑)。だってだんだんクラスが増えて来て、ディレクトリ分けたいな〜と思ったときにいちいちpackage文やimport文直すの面倒なんだよね。全部できてから一気に直せばよし。

javaも確かに悪くないな、と思い始めた今日この頃だけど、このディレクトリ構造がそのままパッケージになっちゃうというのは少々窮屈に感じます。プログラムとしては一まとまりで扱いたいけど、同じディレクトリにバラまくと見にくいから、サブディレクトリに分けたい、という場面には多々遭遇するんですが、そうすると折角のJAVA特有のパッケージ単位のアクセス制御がうまく生かせないんですよね。結局、クラスはみんなpublic修飾子つきで定義してしまって、これじゃC++とかわらん、という状況に。サブディレクトリ止めりゃいいんだけど、lsと打ったときに20を超えるクラスが並ぶのはどうも…。。。まあ、本職のプログラマさん達はプログラム書くのにviなんて使わんのだろうから、lsも打たないんだろうけどさ。

以上、どうでもいいけどもしかしたら人によっては便利かもしれないTipsでした。
[PR]
by lily_lila | 2006-05-17 09:14 | Programing Tips
(STL) iteratorってキャストできるのね(^^;)
こんなインターフェースははたして可能か??
(すみません、かなりオタクっぽいです。行末が切れてたらフォントのサイズをおとして下さい)

using namespace std;

class IParticlePtrVect {
public:
virtual ‾IParticlePtrVect() {}
typedef vector<I3IParticle*>::iterator iterator;
virtual iterator begin() = 0;
virtual iterator end() = 0;
};

ちなみに、I3IParticleはデータメンバなし、関数全部pure virtualの粒子クラス(Javaのinterfaceみたいなやつ)とします。

一方、実装は、

class MyParticlePtrVect : public IParticlePtrVect {
public:
virtual ‾MyParticlePtrVect() {}
virtual iterator begin() { return (iterator &)vector_.begin();}
virtual iterator end() { return (iterator &)vector_.end(); }
private:
vector<MyParticle> vector_;
}

という感じで、MyParticleはI3IParticleを継承した粒子クラス、ということにします。実際に実験した例はboostのshared_ptrを使っていて、データメンバのvector_はvector<shared_ptr<MyParticle> >型です。勿論、vector_にデータをつめるためのpush_back()みたいなのも実装しないとだめだけど割愛します。

で、問題は、このうちのbegin(), end()関数の中身

(iterator &)vector_.begin();

の(iterator &)型キャストは許されるのか、という話です……。

こんな面倒なことせんでも、普通にvector<I3IParticle*>を使えばええやん、という声が聞こえてきそうですが、serializationの事情により、実体に何がつまるかわからんvector<I3IParticle*>型のデータメンバは持ちたくない、というわけです。
(そのへんも自動で判断して正しく保存してくれる賢いpointerがshared_ptrじゃないのか、とめっちゃイチャモンつけたくなりますが、ユーザー定義粒子を含むライブラリをいちいちロードしないと動かんというのはUserが混乱する、という開発グループの方針に沿って苦肉の策というわけです。自分が使うモジュールのロードくらい自分で責任持つわい、と思う私はもう旧世代か??)

で、実験結果ですが。
なんと、コレ、動いちゃったりするんですね。。
まあ、stlのvectorのiteratorは実質ポインタだけど、stl_vector.hをのぞいてみたらただ生ポインタというわけでもなくて、こんな事できそうにもないと早々に諦めていたんですよ。
でも他にどうしても手だてがなくて、ダメモトでやってみたらコンパイルも通ってまともに動いてしまった! なんで動くのか未だにナゾ(笑)。

だれか、理由を知ってる人がいたら教えて下さい。。
(…って、コメント不可にしてるの忘れてた…)コメントOKにしました♪
[PR]
by lily_lila | 2006-05-13 05:19 | Programing Tips
(boost)既に存在するobjectへのポインタを保存するshared_ptr

作り方は

http://boost.cppll.jp/HEAD/libs/smart_ptr/sp_techniques.html#static

を参照。staticオブジェクトへのpointerを保存するshared_ptrの作り方だけど、「ユーザが自分でobjectの寿命を管理できて、もう指してるオブジェクトがないのにshared_ptrから関数を呼び出したりしない」という保証があるなら、shared_ptrに寿命を管理されていないobject、例えば配列の中のobjectなどへのshared_ptrを作ることができそう。
[PR]
by lily_lila | 2006-05-03 09:35 | Programing Tips
(boost) shared_ptrから生ポインタをgetする
この記事は、以下のリンクに移動しました。

「(boost) shared_ptrから生ポインタをgetする」
[PR]
by lily_lila | 2006-05-03 08:28 | Programing Tips
格闘の日々 (対boost)
仕事柄、C++プログラミングに関わっているのですが…
最近、C++のboostライブラリに大変手こずっております(涙)。
個人的にはROOT大好き! 全部ROOTで通して! じゃなきゃいっそJAVAにしろ!! なんて吠えてますが、最近の流行はboostなんだそうで。
フレームワークを作ってる皆様がboost大好きなもんで、こっちは新しい知識に追いつくので精一杯です…こんなことやってる場合じゃないのに(涙)

そんなわけで、このカテゴリはprogramingで試行錯誤した結果の備忘録です…。
[PR]
by lily_lila | 2006-05-03 08:14 | Programing Tips