ホーム » 2004 » 5月 (ページ 3)

月別アーカイブ: 5月 2004

2004年5月
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

検索・リンク

ヒープメモリ関連の説明

スタックエリアの使い方。

動的メモリの利用の基礎として、スタックエリアの使い方。

char bigarea[ xxxxx ] ;
char *tail = bigarea ;
char *table[ 100 ] ;
int  size = 0 ;
char buff[ 1024 ] ;
while( scanf( "%s" , buff ) == 1 ) {
table[ size ] = tail ;
strcpy( tail , buff ) ;
tail += strlen( buff ) + 1 ;
size++ ;
}

のコードにて、使用領域と未使用領域の境界を1つの変数で管理する方式の 説明。この方式は、CASL でのスタック等の考え方と同じである点の説明。

int stack[ 100 ] ;
int sp = 0 ;
void push( int x ) { stack[ sp++ ] = x ; }
int pop() { return stack[ --sp ] ; }
}

にて、Last In First Out の概念を説明。これに伴い、alloca() の使い方も 例を示す。

ヒープメモリの使い方

LIFO が、最後に確保した物から、最初に不要になる場合は OK だけど、 そういう場合で無い時の問題点を指摘して、動的メモリとして、 スタックとヒープがある点を説明してから、malloc の説明。

malloc() に、必要メモリサイズを渡すと、確保されたメモリの先頭が 帰ってくること、free() は、不要となったことをしらせ、その領域が 次の malloc() で再利用されることを説明。

while( scanf( "%s" , buff ) == 1 ) {
table[ size ] = (char*)malloc( strlen( buff ) + 1 ) ;
strcpy( table[ size ] , buff ) ; // NULL チェックはこの後に説明した
size++ ;
}
:
for( i = 0 ; i < size ; i++ )
free( table[ i ] ) ;

体育祭

今日は、体育祭。応援やらデコレーションにて、随分と頑張った学生さんも お疲れ様です。競技風景を色々と写真に撮るが、シャッターの遅延で 通り過ぎた後の写真を何枚もとってしまった。

体育祭の写真やら先日の遠足の写真をWWWにも掲載。 個人写真もあるので、ひとまず他のページからのリンクは 作らずに、教室内にトップページをURLが判るように、印刷物を貼っておく。

私自身の参加種目は、綱引き。開始直後は拮抗するが、じりじりと 引かれて負けてしまう。はぁ。

ディジタル検定3級

講義時間割の都合で発生した、空き時間の資格試験取得に向けた取組みとして、 資格試験向けの補講。 今日は、ディジタル検定3級の問題。4級の問題では、数学的知識の代りに 耳学問的な知識が要求されるが、3級の試験問題は電気回路・電子回路・ 論理回路などの知識があれば、かなりの点数は取れそう。

前川先生の働きにより、受験学生が増えて高専内で試験の実施ができそうな 状態となっている。 補講への参加者は十数名程度であり、 決して参加者が多い訳ではないが、 上位の「やる気」が、全体に感染することを期待して、続けていこう。

文字列の扱いと、文字列数値変換

文字列の扱いについて説明するために、NULターミネータ・文字コード などの説明のあと、文字コードによる演算例を説明する。 配列名は、配列の先頭アドレスを示すことを説明し、文字列演算での 初歩的なミスの事例などの説明を行う。

先週までの説明に、N(2,8,10,16)進法の説明などが多かったので、 文字列を扱うプログラム例として文字列を数値に変換するプログラム 例を見せて説明する。来週は10進法のプログラムを課題として 2,8,16進に拡張させるテーマに取り組む予定。

int my_atoi( char s[] )
{    int i , v = 0 ;  /* エラーチェック無し */
for( i = 0 ; i != '
int my_atoi( char s[] )
{    int i , v = 0 ;  /* エラーチェック無し */
for( i = 0 ; i != '\0' ; i++ )
v = v * 10 + s[i] - '0' ;
return v ;
}
char* my_itoa( char s[] , int x )
{    int i ;            /* short int 程度を限定 */
s[ 5 ] = '\0' ;
for( i = 4 ; i >= 0 ; i-- ) {
int d = x % 10 ;
s[ i ] = d + '0' ;
x /= 10 ;
}
return s ;
}
' ; i++ ) v = v * 10 + s[i] - '0' ; return v ; } char* my_itoa( char s[] , int x ) { int i ; /* short int 程度を限定 */ s[ 5 ] = '
int my_atoi( char s[] )
{    int i , v = 0 ;  /* エラーチェック無し */
for( i = 0 ; i != '\0' ; i++ )
v = v * 10 + s[i] - '0' ;
return v ;
}
char* my_itoa( char s[] , int x )
{    int i ;            /* short int 程度を限定 */
s[ 5 ] = '\0' ;
for( i = 4 ; i >= 0 ; i-- ) {
int d = x % 10 ;
s[ i ] = d + '0' ;
x /= 10 ;
}
return s ;
}
' ; for( i = 4 ; i >= 0 ; i-- ) { int d = x % 10 ; s[ i ] = d + '0' ; x /= 10 ; } return s ; }

具体的に取り組む?

先週までの設計に必要な情報と概要・予定を考えてくるという 提出物は、ほとんど完成度のないものであった。 準備不足のグループは、反省させるべく冷たくあしらう。 自分たちの作りたい物に必要とされる知識が不足していることを 自覚していないグループが多い。

バッティング練習機を作りたいグループ

仮想的な球をバットで打つシステムを作りたいというグループは、 自分たちで作れそうなセンサーの検討からスピードガンみたいな ものを作れないかと方向転換ぎみ。

ナビゲーションの補助をする画像処理装置を作りたいグループ

最初は車外風景を撮影し、目的地の通過を画像処理でドライバーに 伝えるシステムを考えていたグループ。 一昨年度のデジQシステムの画像処理プログラムの例などを見せて 簡単なシステムの話をする。

QRコードなどを使った観光地案内システムを作りたいグループ

最も実現性の高い目標を設定しているグループであるが、プロコン 予選を通過のためにはアイディアを一ひねりする必要性を説明。 実際のプログラム開発への第1段階として、HTML,PHPの例を 実演して説明する。

実際のプログラムにおける再帰方程式

先週までのハノイの塔やらの再帰方程式は、実際のプログラムとは 離れていると感じている学生が多いと思われるのも問題なので、実際的な例にて 再帰方程式の説明。

最初に、先週の授業で説明のできなかったフィボナッチ数列の場合。 再帰によるフィボナッチ数の関数の処理速度のオーダーを求める。 代入法による予想で求めた一般式が、数学的帰納法により正しいことを証明する。 つもりであったが、証明の前準備をしてなかったので、授業中に説明を私自身の 宿題とする。 フィボナッチ数の説明

このあと、マージソートプログラムが、O(N log N)であることの説明として、 マージソートプログラムの概念を示し、再帰方程式を示し、代入法により証明を行 う。

余った時間には、来週からのヒープメモリの解説の前準備として、 名前列の2次元配列への記憶で、可変長配列が使えないC言語では、 最大データに合わせて配列宣言を行うと、 メモリの使用効率に無駄が発生することを説明。

システム

アーカイブ

カテゴリー