ホーム » 2010 » 10月 » 12

日別アーカイブ: 2010年10月12日

2010年10月
« 9月   11月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

最近の投稿(電子情報)

アーカイブ

カテゴリー

file-scope(static)とextern文

プロコンの競技部門の学生さんたちが、最後の追い込み。 各パーツに分かれて動作確認が取れてきたし、 1つのプログラムに合成する最後の段階になっている様子。 しかしながら、合成した後プログラムが動かないとの相談。 1度目の処理は動くけど、2回目で動かないという状態なので、 不完全な初期化データを使って動かなくなっているのではと想像する。 といっても、そう簡単に間違いが見つかる訳もないけど、 ひとまずコードを見せてもらう。 すると、覚えたての分割コンパイルで、ヘッダファイルの中に、 static int array[…] ; といった記載が見つかる。

このままでは、array[] が、各C言語ファイル毎に、file-scope の別な実体を持つため、 大域変数渡しの副作用が伝わらなかったり、その結果として未初期化が発生したり。

ファイルスコープ

C言語では、静的変数の局所変数を作りたい場合、関数ブロック内で "static"キーワードを指定すればよい。 しかしながら、関数ブロック外で static キーワードをつけると、 分割コンパイルした場合、file-scope を持つようにコンパイルされる。 つまり、各ファイル毎の大域変数は、たとえ同じ名前の大域変数が別ファイルに あったとしても、別な記憶領域を確保してくれる。

(( aaa.c ))
int x1 ;         // 静的変数・大域変数
static int x2 ;  // 静的変数・大域変数・ファイルスコープを持つ
void foo() {
static int x3 ; // 静的変数で局所変数
:
}
(( bbb.c ))
extern int x1 ;  // aaa.c の x1と同じ実体を参照できる。
static int x2 ;  // aaa.cのx2とは大域変数だけど別の実体をもつ

分割コンパイルして、各ファイルで共通の変数や関数を定義する場合は、 以下のように行う。 ポイントは、extern によって宣言すると、実体は別のところにある変数となる。

(( common.h ))
int foo() ;      // プロトタイプ宣言
extern int bar ; // 実体はどこかで確保される変数として宣言
(( aaa.c ))
#include "common.h"
int bar = 123 ;  // 変数barの実体
int foo() {
// 関数foo()の実体
}
(( bbb.c ))
#include "common.h"
void main() {
bar = 234 ;              // aaa.c の大域変数barに代入
printf( "%d" , foo() ) ; // aaa.c の関数foo()を呼び出し
}

関係データベースとSQL

データベースの基礎の説明が終わったので、 データベースの実際のデータベース操作言語SQLの詳細を説明する。

関係データベースの用語

関係データベースでは、表構成のデータで表現され、 集合であらわされる項目の複数の組み合わせで表現される。 1つの項目フィールドの取り得る値の集合をAとした場合、 直積とは、 で表現される。A,Bの間の関係とは、直積の一部 であらわされる。

SQLの基本

SQLの基本として、データのテーブルを作る "CREATE TABLE" 文の説明として、 数値型・文字型・日付型などの型の名前や説明を交えながら説明。 参考にしている教科書では、CREATE VIEWの説明がある割に、CREATE TABLEの説明が無い… この他に、INSERT文の説明を行う。

データを探す場合は、SELECT文を使うが、 選択とは、特定条件のレコードを探す処理、射影でそのレコードの中の特定のカラムを取り出す。 結合とは、カラムの組み合わせを記述すものである。

SELECT  [射影] FROM [結合] WHERE [選択] ;
例: SELECT S.名前 FROM S,P WHERE P.点数>80 AND S.学科='電子情報' ;

教科書で説明の無い部分として、WHERE節の中のBETWEEN,LIKE,IS NULLなどを紹介。

来週は副問い合わせ文などの説明の後、Web上のSQL演習環境を説明した後、練習課題とする。

計算機システム:OSの歴史と機能概要

コンピュータの歴史の説明の後の、8bit,16bitのパソコンの発達をうけ、 32bitパソコンの発達やOSの発達について説明する。

16bitパソコンの登場とともに、マイクロソフト社のMS-DOSや、GUIを取り入れたApple社の Macintoshの発達したころ、16bitコンピュータはシングルタスク・シングルユーザであった。 この頃の汎用機では、その計算機パワーを活用すべくマルチユーザ・マルチタスクで 処理が行われていた。 この便利な機能を、ミニコンやパソコンで使いたいという要求がでてきた。 この中で、C言語を開発したカーニハンやリッチーは、Multicsをミニコンで動かすために、 unixを開発した。 unixでは、複数ユーザが同時に複数の処理をこなすために、プログラムが並行動作している 別プログラムに悪影響を及ぼさないようにするなどの保護機能・セキュリティ機能が 重要になってきた。 32bitコンピュータが出てきたころになり、パソコンでもようやくマルチタスク・マルチユーザを 実現するための保護機能を実装できるようになってきた。 パソコンOSでは、Windows 95/98/Me/Home等ではシングルタスク・シングルユーザ がベースであった。しかし、OS/2やWindows/NT/2000/Xp/Vista/7とマルチタスク・マルチユーザ の機能が発達していった。 一方、unixでは、BSD/SysVの2系統に分かれて発達する中、 インターネットを利用したオープンソースのOSのLinuxが発達していく。

コンピュータの基本構成

計算の手順はプログラムであり、計算に必要なデータと共に使われることで、 ソフトウェアと呼ばれる。プログラムの計算手順の考え方はアルゴリズムと呼ばれる。 コンピュータは、CPU,メモリ(主記憶),補助記憶装置,周辺装置から成り立っている。 ほとんどのコンピュータは、ノイマン型と呼ばれる構成で、 (1)メモリから命令を読む,(2)命令を解読,(3)データをメモリから読む,(4)計算,(5)結果をメモリに書き込むの処理を繰り返して行われる。

主記憶のメモリには、不揮発性のROMと揮発性のRAMがあり、 最近のOSでは、処理に応じてプログラムの中身を変える必要から、 RAMがほとんどとなっている。 しかし、このままでは電源を入れた直後のコンピュータは動けない。 このためメモリの一部はROMがあり、この中には、 周辺装置の使い方BIOSと、電源投入直後の処理ブートローダのプログラムが 書き込まれている。 コンピュータは、ブートローダがBIOSを使って、補助記憶装置内のOSを主記憶に呼び出して OSが動き始める。利用者が、アプリケーションを起動すると、 OSが補助記憶装置内のプログラムをRAMに呼び出して処理が行われる。

プログラムを動かすにあたって、CPUでは機械語で処理が行われる。 昔はプログラムはアセンブリ言語を使って記述していた。 しかし高級言語の登場によって、プログラムが書きやすくなった。 高級言語で書かれたプログラムが動くにあたって、実行方式にはコンパイラ方式インタプリタ方式がある。 コンパイラ方式は、処理前に機械語をすべて生成してあるため、実行速度が速い。 しかしテストプログラムを動かすような場合、全命令を機械語に直す時間がかかるので、 インタプリタ方式が多用される。コンパイラ方式は実行時に高級言語で書かれた ソースプログラムが不要のため、プログラムの考え方が盗まれることがない。