みぃちゃんの頭の中はおもちゃ箱

略してみちゃばこ。泣いたり笑ったり

都会のヒガンバナ

2014年09月20日 22時33分26秒 | 草木をめでる
flower149A.jpg: ヒガンバナ

ヒガンバナが さく季節に なりました。

flower149B.jpg: ヒガンバナ

くさむらに突然あかい はながパッと あらわれます。アスファルトとコンクリートで かためられた都会の住宅地でも みちばたや のきさきなど、意外と あちこちでヒガンバナをみかけます。さがして あるくのも おもしろい。

※ この記事の本文からは漢字の訓を排除しています。

バス タオル再登場

2014年09月19日 22時15分03秒 | 日常のあれこれ
バス タオルをひっぱりだしました。理由は すずしく なったから。

あつい なつの あいだ、おふろから でた あとは そのままパジャマをきていました。あつい季節で なければ いったん からだをタオルで ふいた あとに のこった みずけをかわいたバス タオルで とるのですが、まなつは どうせ あせをかくので、はだに のこった みずけをとっても また はだが しめってしまいます。それなら ふく必要は ありません。からだに ついた みずけもパジャマに すわせて あせと一緒に蒸発させれば すずしいかと、この なつの後半はバス タオルをつかいませんでした。

すずしく なったのでバス タオル再登場。

※ この記事の本文からは漢字の訓を排除しています。

分岐管を流用できるかな?

2014年09月18日 22時38分47秒 | 日常のあれこれ
先日ネットで かった温水洗浄便座が とどいたので、説明書をぱらぱらと めくり、設置の て順を確認しました。そんなに複雑なものでは ないので、業者に たのまなくても自分で設置できます。水道管から分岐して温水洗浄便座に みずをとおす くだを接続しなければ なりませんが、既存の分岐管をそのまま つかえれば楽です。つかえるかな? 付属の くだは規格品でしょうから、ねじの径も あうはずです。ちょっと みてみましょう。

※ この記事の本文からは漢字の訓を排除しています。

やっぱりオブジェクト指向は強力

2014年09月17日 22時10分45秒 | IT・デジタル
開発中のプログラムのコーディングが ひとつの やまをこえました。のべ むいか間の作業のうち、コーディングに みっか強、デバッグに ふつか強かかりました。以前つくったものより高機能に なったにも かかわらず、コードの構造は逆にシンプルになっています。

毎度毎度のことですが、コードの要所要所でデータのスナップショットを出力するようにデバッグ ルーチンを しこんでおき、デバッグ時には出力されたログをみてデータが所定の変化をしているか追跡します。この実行とログの追跡を、簡単なデータから はじめ、すこしずつ複雑なデータをあたえて くりかえします。

デバッグ当初に てをやいたバグはメモリの破壊でした。変なデータが突然あらわれて、「うわ、これはポインタのバグだ」と覚悟しました。ポインタのバグは さがしだして修正するのが大変です。複雑なポインタ操作は してないはずなんだけどなぁ。

原因は、配列の終端をこえて かきこんだことでした。ありがちなバグです。配列を1要素分だけ ながく確保しておくべきところを、そうしていませんでした。

配列のバグのほかは、デバッグは順調に すすみました。途中でデータを分割して非同期的に処理をすすめ、それぞれの結果をあとで合成する処理も一発で正常動作。再帰下降処理も一発。ほかも ちいさな修正があっただけ。自分でも おどろくほどコードが すなおに うごいてくれます。デバッグが順調すぎて こわい。C++には言語として ばあたり的に拡張されてきたような側面も ありますが、やっぱりオブジェクト指向は強力です。

※ この記事の本文からは漢字の訓を排除しています。

C++の怪

2014年09月16日 22時31分37秒 | IT・デジタル
C++では、ときどき奇怪な振る舞いに振り回されることがあります。

あるコンテナ クラスUniqueContainerを作りました。このクラスは内部にコンテナを保持しますが、そのコンテナに要素を保存するときに特別な操作をします。具体的には、各要素を必ず一意とし、重複する要素を挿入 (insert) する操作は無視します (そのほか、優先順位付きキューとして機能する、キーで値を検索できるなどの機能を実装しています)。しかし、標準ライブラリ (STL) でサポートされている一般的なシーケンス操作 (UniqueContainerの要素で他のコンテナを初期化したりUniqueContainerの要素を検索したり) は幅広く使えるようにしたいので、コンテナに対するconst_iteratorは取得できるようにします。ただし、今後個別の事例に対応して拡張できるように、派生クラスにはコンテナの要素を直接変更する操作を許可します (派生クラスでコンテナの秩序を壊さないように注意を払うのは、派生クラスを作成するプログラマの責任とします)。
template< class T>
class UniqueContainer
{
public:
  bool insert( void);
  ...
  const_iterator begin( void) const { return c_.begin(); }
  const_iterator end  ( void) const { return c_.end  (); }

protected:
  iterator begin( void) { return c_.begin(); }
  iterator end  ( void) { return c_.end  (); }

private:
  SomeContainer< T> c_;
};


このクラスを利用するクラスを作りました。
class Hoge
{
UniqueContainer< SomeType *> uc;

void delptr( void);
...
};

コンテナucには、動的に確保したオブジェクトを指すポインタを格納します。当然、使い終わったら領域を解放する必要があります。以前に作ったポインタ削除用の述語があるので、それを流用します。

template< class T>
struct DeletePointer : public std::unary_function< T *, T *>
{
T *operator()( T *p) const { delete p; return 0; }
};

void delptr( void)
{
for_each( uc.begin(), uc.end(), DeletePointer< T>());
}

ところが、このコンパイルが通らない。delptr() からiterator UniqueContainer::begin( void) にはアクセスできないというエラーが発生して、はねられてしまいます。
for_eachとDeletePointerを展開した後は

for (first != last)
delete *first++;

になるはずで、コンテナucの要素自体は変更しませんから、delptr()からアクセス可能なconst_iterator UniqueContainer::begin( void) constのバージョンを呼び出せば構わないはずです。ところが、コンパイラは非constバージョンのbegin()とend()を選択します。非constバージョンはprotectedメンバですから、当然delptr()から呼び出すことはできません。

void delptr( void) const
{
for_each( uc.begin(), uc.end(), DeletePointer< T>());
}

と変更すればconstバージョンのbegin()とend()が呼び出されます。どうやら、delptr()がクラスHogeのオブジェクトを変更できるかできないか (実際に変更するかどうかではなく、宣言上変更できるかどうか) によってconst_iteratorかiteratorかが選択されているようです。

仕方がないので、非constバージョンのbegin()とend()の名前を変えることにしました。

template< class T>
class UniqueContainer
{
...
protected:
iterator begin_nc( void) { return c_.begin(); }
iterator end_nc ( void) { return c_.end (); }
...
};

標準ライブラリ (STL) のコンテナでは、const_iteratorバージョンとiteratorバージョンのいずれでも同じ名前begin()とend()を使っています。当然UniqueContainerでも両方とも同じ名前にして統一したいのですが、仕方ありません。名前を別にしておけば、void delptr( void) constでなく元のvoid delptr( void)のままでもちゃんとconst_iteratorバージョンが選択され、コンパイル エラーは出ません (じゃ、最初からそうしてよ)。

名前が違っていれば、派生クラスを書くときに、基底クラスでコンテナに課している制約 (各要素が一意であるなど) を強く意識することになりますから、これはこれでいいかな。