• 検索結果がありません。

プログラミング演習

N/A
N/A
Protected

Academic year: 2021

シェア "プログラミング演習"

Copied!
20
0
0

読み込み中.... (全文を見る)

全文

(1)

プログラミング演習

プログラミング演習

IIII

20042004 1010 2626 日(第日(第 22 回)回)

理学部数学科・木村巌 理学部数学科・木村巌

(2)

前回までの復習 前回までの復習

ローカル変数ローカル変数

グローバル変数グローバル変数

変数の可視範囲変数の可視範囲

変数の寿命変数の寿命

staticstatic なローカル変数なローカル変数

(3)

今日学ぶこと 今日学ぶこと

関数の宣言関数の宣言

複数のファイルからなるプログラムを作成複数のファイルからなるプログラムを作成 できるようになる

できるようになる

複数のファイルからなるプログラムでのス複数のファイルからなるプログラムでのス コープを理解する

コープを理解する

標準ライブラリ関数とは何かを理解する標準ライブラリ関数とは何かを理解する

標準ライブラリ関数の使い方を身につける標準ライブラリ関数の使い方を身につける

教科書教科書 8.88.8 から(から( p. 261p. 261 ~)~)

(4)

関数の宣言 関数の宣言

関数プロトタイプ宣言関数プロトタイプ宣言

関数の名前、引数の数、引数の型、返値の型関数の名前、引数の数、引数の型、返値の型 をコンパイラに知らせる

をコンパイラに知らせる

コンパイラは、コンパイル時にこれらをコンパイラは、コンパイル時にこれらを チェックできる(静的な検査)

チェックできる(静的な検査)

構文構文

戻り値の型 関数名

戻り値の型 関数名 (( 引数リスト引数リスト ););

最後のセミコロンを忘れないこと最後のセミコロンを忘れないこと

Sample12.c を入力して、コンパイル・実を入力して、コンパイル・実

(5)

ファイルを分割する ファイルを分割する

関数プロトタイプ宣言は、複数のファイ関数プロトタイプ宣言は、複数のファイ ルからなるプログラムの作成に特に有効 ルからなるプログラムの作成に特に有効

他のプログラムでも作成するような関数他のプログラムでも作成するような関数 は、用途別に別のファイルにしておく は、用途別に別のファイルにしておく

その関数のプロトタイプ宣言も、いわゆその関数のプロトタイプ宣言も、いわゆ る「ヘッダーファイル」に別に記述して る「ヘッダーファイル」に別に記述して おくおく

(6)

複数ファイルからなるプログラム 複数ファイルからなるプログラム

の例の例

myfunc.h, myfunc.c, Sample13.c myfunc.h, myfunc.c, Sample13.c p.264p.264 を入力し、コンパイル、実行してみよう を入力し、コンパイル、実行してみよう

(次のスライド参照)(次のスライド参照)

コンパイル・リンク・オブジェクトファコンパイル・リンク・オブジェクトファ イルといった専門用語については、前期 イルといった専門用語については、前期 4/284/28 の回のスライドを参照の回のスライドを参照

(7)

コンパイルの仕方 コンパイルの仕方

コンパイルの仕方:二通りあるコンパイルの仕方:二通りある

一気に実行ファイルを作成する一気に実行ファイルを作成する

gcc –o Sample13 Sample13.c myfunc.cgcc –o Sample13 Sample13.c myfunc.c

一旦オブジェクトファイルを作り、それ一旦オブジェクトファイルを作り、それ らをリンクする

らをリンクする

gcc –c Sample13.cgcc –c Sample13.c

gcc –c myfunc.cgcc –c myfunc.c

gcc –o Sample13 Sample13.o myfunc.ogcc –o Sample13 Sample13.o myfunc.o

(8)

コンパイルの仕方(続き)

コンパイルの仕方(続き)

一度オブジェクトファイルを作ると、変一度オブジェクトファイルを作ると、変 更を加えなかった方は、コンパイルし直 更を加えなかった方は、コンパイルし直

さなくてもよい さなくてもよい

例:例: Sample13.cSample13.c は変更したが、は変更したが、 myfunc.cmyfunc.c は変更していない場合:

は変更していない場合:

gcc –o Sample13 Sample13.c myfunc.ogcc –o Sample13 Sample13.c myfunc.o

巨大なプログラムの場合、コンパイルす巨大なプログラムの場合、コンパイルす るだけで何時間もかかることがある

るだけで何時間もかかることがある

(9)

標準ライブラリ関数の仕組みを知 標準ライブラリ関数の仕組みを知

標準ライブラリ関数標準ライブラリ関数

CC 言語の規格で定められている、基本的な処言語の規格で定められている、基本的な処 理(入出力、文字列操作など)を行うための 理(入出力、文字列操作など)を行うための 関数関数

どのどの CC コンパイラにも付属しているコンパイラにも付属している

例:例: printf(), scanf()printf(), scanf() などなどなどなど

標準ライブラリ関数のプロトタイプ宣言標準ライブラリ関数のプロトタイプ宣言

それぞれ記述されているヘッダファイルが定それぞれ記述されているヘッダファイルが定 められている

められている

例:例: printf()printf() ならなら stdio.h stdio.h のようにのように

(10)

ヘッダファイルの指定 ヘッダファイルの指定

標準のヘッダファイルの読み込み標準のヘッダファイルの読み込み

#include <stdio.h>#include <stdio.h> のように、のように、 <><> で指示するで指示する

自分で作成したヘッダファイルの読み込自分で作成したヘッダファイルの読み込

#include “myfunc.h”#include “myfunc.h”  のように、””で指示 のように、””で指示 するする

(11)

標準ライブラリ関数はどこにある 標準ライブラリ関数はどこにある

のか?のか?

標準ライブラリ関数の実体は、標準ライブラリ関数の実体は、 /usr/bin/libc.a /usr/bin/libc.a という、スタティックライブラリに含まれて という、スタティックライブラリに含まれて いるいる

複数のオブジェクトファイルを、ひとつの複数のオブジェクトファイルを、ひとつの アーカイブファイル(

アーカイブファイル( archive filearchive file )にまとめ)にまとめ る事ができる

る事ができる

リンク時に、リンカが必要な関数を取り出しリンク時に、リンカが必要な関数を取り出し て、実行ファイルにまとめる

て、実行ファイルにまとめる

ar –t /usr/lib/libc.aar –t /usr/lib/libc.a  で、 で、 libc.alibc.a 内のオブジェク内のオブジェク トファイル一覧を見ることができる

トファイル一覧を見ることができる

(12)

ライブラリを作ってみる ライブラリを作ってみる

myfunc1.c myfunc1.c myfunc2.cmyfunc2.c  を作る。それ を作る。それ ぞれ、ぞれ、 void myfunc1(void){}, void myfunc2void myfunc1(void){}, void myfunc2

(void){}

(void){} のみ含むことにするのみ含むことにする

gcc –c myfunc1.cgcc –c myfunc1.c

gcc –c myfunc2.cgcc –c myfunc2.c

これで、これで、 myfunc1.omyfunc1.o myfunc2.omyfunc2.o ができるができる

ar –q libmyfunc.a myfunc1.o myfunc2.oar –q libmyfunc.a myfunc1.o myfunc2.o

これで、これで、 libmyfunc.a というアーカイブがというアーカイブが

(13)

ライブラリを使ってみる ライブラリを使ってみる

main.c main.c というファイルに、というファイルに、 main()main() を書いを書い ておくておく

main()main() 内で、内で、 myfunc1(), myfunc2()myfunc1(), myfunc2() を呼びを呼び 出す出す

gcc –o main main.exe –L. –lmyfuncgcc –o main main.exe –L. –lmyfunc

これで、これで、 main.exemain.exe ができるができる

main.exemain.exe  には、 には、 libmyfunc.alibmyfunc.a から、から、 myfumyfu nc1()

nc1() myfunc2()myfunc2() がリンクされるがリンクされる

(14)

複数のファイルからなる 複数のファイルからなる

プログラムでのスコープ プログラムでのスコープ

識別子がプログラムの全域で可視:「外識別子がプログラムの全域で可視:「外 部リンケージを持つ」という

部リンケージを持つ」という

識別子が、宣言されたファイルでのみ可識別子が、宣言されたファイルでのみ可 視:「内部リンケージを持つ」という 視:「内部リンケージを持つ」という

外部リンケージを持つのは:関数名、グ外部リンケージを持つのは:関数名、グ ローバル変数名

ローバル変数名

内部リンケージを持つのは:それ以外内部リンケージを持つのは:それ以外 例外あり(次のスライド)

例外あり(次のスライド)

(15)

複数のファイルからなる 複数のファイルからなる

プログラムでのスコープ(続き)

プログラムでのスコープ(続き)

staticstatic をつけた関数名は、内部リンケージをつけた関数名は、内部リンケージ を持つを持つ

変数名に付ける変数名に付ける staticstatic (変数の寿命の指(変数の寿命の指 定)とは、意味がまったく異なるので、

定)とは、意味がまったく異なるので、

注意注意

(16)

グローバル変数は乱用しない グローバル変数は乱用しない

グローバル変数:プログラムの全体からグローバル変数:プログラムの全体から 読み書き可能

読み書き可能

使い方を誤ると、厄介なバグ(使い方を誤ると、厄介なバグ( bug, bug, プロプロ グラムの不具合)を招く

グラムの不具合)を招く

プログラムのどの箇所で変更されたのかプログラムのどの箇所で変更されたのか

、追跡しづらい

、追跡しづらい

絶対に必要な場合にしか使わないこと絶対に必要な場合にしか使わないこと

(17)

自作のライブラリを作る場合 自作のライブラリを作る場合

ライブラリのユーザにとって、簡便で、ライブラリのユーザにとって、簡便で、

使いやすいライブラリになることを目指 使いやすいライブラリになることを目指

不必要な関数は、不必要な関数は、 staticstatic にして、内部リンにして、内部リン ケージを持たせる

ケージを持たせる

必要な関数のみ、ヘッダファイルに記述必要な関数のみ、ヘッダファイルに記述 して、プログラムから使えるようにする して、プログラムから使えるようにする

(18)

今日学んだこと 今日学んだこと

関数の宣言関数の宣言

複数のファイルからなるプログラム複数のファイルからなるプログラム

複数のファイルからなるプログラムでの複数のファイルからなるプログラムでの スコープスコープ

標準ライブラリ関数とは何か標準ライブラリ関数とは何か

標準ライブラリ関数の使い方標準ライブラリ関数の使い方

(19)

レポート課題 レポート課題

与えられた与えられた longlong が素数ならが素数なら 1, 1, そうでないならそうでないなら 00 を返す関数を返す関数 int isprime (long p)int isprime (long p) を含むを含む isprime.isprime.

c, c, そのプロトタイプ宣言を含むそのプロトタイプ宣言を含む isprime.h, mainisprime.h, main ()() 関数を含む関数を含む main.cmain.c をそれぞれ作成せよ.をそれぞれ作成せよ. maimai n()n() を実行すると、整数を入力するよう促し、を実行すると、整数を入力するよう促し、

素数であるか、そうでないかを表示すること.

素数であるか、そうでないかを表示すること.

締め切り:締め切り: 20042004 1111 11 日一杯(日本時間日一杯(日本時間 で)で)

提出:メールで木村(提出:メールで木村( iwao@sci.toyama-u.ac.jpiwao@sci.toyama-u.ac.jp

)まで.)まで.

感想などあると木村が喜びます感想などあると木村が喜びます

(20)

レポートのヒント レポートのヒント

int isprime (long p) ; /*

int isprime (long p) ; /* プロトタイプ宣言 プロトタイプ宣言 */*/

int isprime (long p) { … } /*

int isprime (long p) { … } /* 関数の定義 関数の定義 */*/

main.cmain.c ではでは

#include <stdio.h>

#include <stdio.h>

#include “isprime.h”

#include “isprime.h”

int main (void) { … } int main (void) { … }

参照

関連したドキュメント

問についてだが︑この間いに直接に答える前に確認しなけれ

厳密にいえば博物館法に定められた博物館ですらな

90年代に入ってから,クラブをめぐって新たな動きがみられるようになっている。それは,従来の

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

ヒュームがこのような表現をとるのは当然の ことながら、「人間は理性によって感情を支配

なお、相続人が数人あれば、全員が必ず共同してしなければならない(民

7.自助グループ