ホーム » 2005 (ページ 14)
年別アーカイブ: 2005
Google の使い方
Google は、以前から電卓機能やら link: やら裏技的使い方が色々あるのは 聞いていたけど、 荷物検索、会社情報検索、路線検索なんていうのはしらんかった。
# 検索で『鯖江から武生』と入力するだけで、路線検索してくれるんだもんなぁ….
Debian/GNU Linux sarge が正式リリース。
Debian/GNU Linux sarge が正式リリース。
Debian/GNU Linux sarge が stable として正式にリリースされた。 これに伴い、サーバの apt-line にある woody を消す。 ほとんど、sarge ベースに直していたが、正式リリースに会わせて、 パッケージ名の更新があったのか、予想外にいくつものパッケージが更新された。
図形のデータにて、仮想関数の課題
昨年度と同様に、図形の表示を仮想関数により実装するプログラム例を見せ、 これに対し、色付き図形を扱うプログラムにバージョンアップしてもらう。 時間の後半は、上記課題に取り組んでもらう時間とした。
リスト構造の導入
先週の『次のデータの場所』の保存の例を、リスト構造にて説明する。
struct List { int data ; struct List* next ; } ; struct List* p ; p = (struct List*)malloc( sizeof( struct List ) ) ; p->data = 1 ; p->next = (struct List*)malloc( sizeof( struct List ) ) ; p->next->data = 2 ; p->next->next = (struct List*)malloc( sizeof( struct List ) ) ; p->next->next->data = 3 ; p->next->next->next = NULL ; struct List* q ; for( q = p ; q != NULL ; q = q->next ) printf( "%d\n" , q->data ) ;
ポインタと配列
ポインタと配列について説明する。 講義にさきがけ、昨年度のテスト問題を印刷した物を配布する。 ポインタの説明では、ポインタ渡しの事例と配列的な使い方と、 ポインタ走査処理の事例を紹介する。 話の中で、古いC言語の規格を対比的に説明するが、 古いコンピュータの処理性能が低かった事を、雑談として説明する。
無線LANの電界強度測定
kismet で monitor モードにして無線 LAN の電界強度測定をするには、 orinoco のドライバの修正が必要なので、カーネル再構築を行う。 ただし、ターゲットマシンの vaio は、ハードディスクが容量不足なので、 別のマシンでコンパイル。
orinoco の無線 LAN カードで、monitor モード
≪ カーネル展開+patch適用 ≫ # apt-get install kernel-source-2.4.27/testing $ tar jxvf /usr/src/kernel-source-2.4.27.tar.bz2 $ cd kernel-source-2.4.27 $ patch -p0 < ../orinoco-0.13e-patch-vl1.diff # kmotohara氏patchを使う $ cp /boot/config-2.4.27-2-686 .config # コンパイル設定を流用
カーネル再構築
≪ カーネル再構築 ≫ $ make menuconfig $ fakeroot make-kpkg clean $ fakeroot make-kpkg --initrd --revision=orinoco kernel_image modules_image
kismet を最新に
$ wget http://www.kismetwireless.net/code/kismet-2005-04-R1.tar.gz $ tar zxvf kismet-2005-04-R1.tar.gz $ cd kismet-2005-04-R1 $ ./configure ; make dep ; make
導出(継承)と、仮想関数
先週頃より、電子情報以外の学科の学生さんは、 難しいのか参加しなくなってきた。 5名だけを相手の説明って何だか寂しいなぁ。
先週に説明した、導出の概念をもう一度説明した後、クラスの格下げにより できそうでできない処理の例を説明する。
class Syain { private: char name[10] ; int age ; public: Syain( char s[] , int a ) { strcpy( name , s ) ; age( a ) ; } void print() { printf( "%s %d" , name , age ) ; } } ; class Jyoshi : public Syain { private: Syain *buka[10] ; int size ; public: Jyoshi( char s[] , int a ) : Syain( s , a ) { size = 0 ; } } ; int main() { Syain a( "ひら1" , 24 ) ; Syain b( "ひら2" , 27 ) ; a.print() ; Jyoshi c( "部長" , 43 ) ; c.print() ; // 継承により、OK Jyoshi d( "社長" , 59 ) ; c.add( &a ) ; c.add( &b ) ; // cの部下の追加 d.add( &c ) ; // c は Syain に格下げされて追加された。 Syain e( "ひら3" , 33 ) ; d.buka[0]->add( &e ) ; // ☆NG: buka[0] は c:Jyoshi だけど、 return 0 ; // 格下げされているので add を実行できない。 }
上記の例の解決策の方向性として、仮想関数の話しを行う。 最初に、C 言語の共有体(union)を用いて、1つの配列に異なる型を入れるテクニック を紹介し、型識別番号と分岐処理の手間を説明する。 この問題の解決策として以下のような仮想関数を利用した事例を紹介。
class Data { public: virtual void print() = 0 ; } ; class Int : public Data { private: int x ; public: Int( int a ) : x( a ) {} virtual void print() { printf( "%d" , x ) ; } } ; class Double : public Data { private: double y ; public: Double( double a ) : y( a ) {} virtual void print() { printf( "%f" , y ) ; } } ; class String : public Data { private: char s[ 10 ] ; public: String( char*a ) { strcpy( s , a ) ; } virtual void print() { printf( "%s" , s ) ; } } ; int main() { Int a( 123 ) ; Double b( 1.234 ) ; String c( "ABC" ) ; Data* array[3] ; array[0] = &a ; // 仮想関数でなければ、クラスの格下げが発生している array[1] = &b ; array[2] = &c ; for( int i = 0 ; i < 3 ; i++ ) // 仮想関数の呼び出し array[i]->print() ; // 異なる型が混ざった配列でも OK return 0 ; }
仮想関数と継承の考え方の応用事例として、コンテナクラスなどの便利な機能が 実現できることや、C++ では template によるコンテナクラスの事例が多いので、 以下の template 文の事例を紹介する。
template swap( T* a , T* b ) { T c = *a ; *a = *b ; *b = c ; } void main() { int a = 123 , b = 234 ; float c = 1.234 , d = 2.345 ; swap( &a , &b ) ; swap( &c , &d ) ; }
課題の作成とリスト構造導入
センター端末室で、malloc,free を使った可変長配列としての利用の 課題に取り組んでもらう。テストも近いし、リスト構造の導入説明も行う。
『配列の問題点として、途中へのデータ挿入処理が O(N) アルゴリズムであり、 効率が悪いので、解決策は?』という導入より、 配列の添字によるリスト構造を説明し、挿入処理が一定時間で実現できる点を説明。
malloc+free
先週の説明後半で簡単に紹介した malloc + free の説明を繰り返す。 メモリーリークの問題やヒープメモリはプロセス終了時に回収される点の説明を行う。 プログラム例として、文字列をheapに記憶する処理を示す。 来週は、センターにて課題に取り組む予定。 課題は、配列サイズや文字列長サイズが不定であることを想定して、 データの入出力を行うプログラムを作ること。
時間が余ったので、C++ での new,delete の事例も紹介する。