当日のOHP資料です。
Download : sample-001.c ( SJIS 版 )
/* * 2013/11/08 sample-001.c */ /* * 二つの関数からなるプログラム * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( char *string, int number ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ } /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "abc", 123 ); printf ( "返り値 : %f\n", ret ); return 0; }
C:\usr\c>sample-001 文字列 : abc, 整数値 : 123 返り値 : 41.000000 C:\usr\c>
Download : sample-002-01.c ( SJIS 版 )
/* * 2013/11/08 sample-002-01.c */ /* * ファイルの分割(2/2) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -c sample-002-01.c * 実行 * sample-002-01 */ #include <stdio.h> /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( char *string, int number ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
Download : sample-002.c ( SJIS 版 )
/* * 2013/11/08 sample-002.c */ /* * ファイルの分割(1/2) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -c sample-002.c * 実行 * sample-002 */ #include <stdio.h> /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "abc", 123 ); printf ( "返り値 : %f\n", ret ); return 0; }
C:\usr\c>sample-002 文字列 : abc, 整数値 : 123 返り値 : 33.000000 C:\usr\c>
Download : sample-003-01.c ( SJIS 版 )
/* * 2013/11/08 sample-003-01.c */ /* * ファイルの分割(2/2) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -c sample-003-01.c * 実行 * sample-003-01 */ #include <stdio.h> /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( char *string, int number ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
Download : sample-003.c ( SJIS 版 )
/* * 2013/11/08 sample-003.c */ /* * ファイルの分割(1/2) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -c sample-003.c * 実行 * sample-003 */ #include <stdio.h> /* * 呼び出す関数のプロトタイプ宣言 */ extern double any_function ( char *string, int number ); /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "abc", 123 ); printf ( "返り値 : %f\n", ret ); return 0; }
C:\usr\c>sample-003 文字列 : abc, 整数値 : 123 返り値 : 41.000000 C:\usr\c>
Download : sample-004-01.c ( SJIS 版 )
/* * 2013/11/08 sample-004-01.c */ /* * ファイルの分割(2/2) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -c sample-004-01.c */ #include <stdio.h> #include "sample-004-01.h" /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( char *string, int number ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
Download : sample-004.c ( SJIS 版 )
/* * 2013/11/08 sample-004.c */ /* * ファイルの分割(1/2) * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -c sample-004.c * 実行 * sample-004 */ #include <stdio.h> #include "sample-004-01.h" /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "abc", 123 ); printf ( "返り値 : %f\n", ret ); return 0; }
C:\usr\c>sample-004 文字列 : abc, 整数値 : 123 返り値 : 41.000000 C:\usr\c>
Download : sample-004-01.h ( SJIS 版 )
/* * 2013/11/08 sample-004-01.h */ #ifndef __FILENAME_H__ #define __FILENAME_H__ /* * 関数のプロトタイプ宣言 */ extern double any_function ( char *string, int number ); #endif
/* * 2013/11/08 sample-001.c */ /* * 二つの関数からなるプログラム * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( char *string, int number ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n\n\n", string, number ); return number/3.0; /* 返り値 */ } /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); printf ( "返り値 : %f\n\n\n", ret ); return 0; }
/* * p-002-main.c : p-002 の main 関数 */ #include <stdio.h> /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); /* any_function を利用してる -> 何かいらないの ?? 結論 : 何かがたりないので、上手くゆかない 実は ... any_function がどんなものかが解らない */ printf ( "返り値 : %f\n", ret ); /* printf を利用している -> #include <stdio.h> が必要 */ return 0; }
/* * p-002-sub.c : p-002 の any_function */ #include <stdio.h> /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( char *string, int number ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
/* * p-003-main.c : p-003 の main 関数 */ #include <stdio.h> /* any_function のプロトタイプ宣言 */ extern double any_function ( char *string, int number ); /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); /* any_function を利用してる -> 何かいらないの ?? 結論 : 何かがたりないので、上手くゆかない 実は ... any_function がどんなものかが解らない */ printf ( "返り値 : %f\n", ret ); /* printf を利用している -> #include <stdio.h> が必要 */ return 0; }
/* * p-003-sub.c : p-003 の any_function */ #include <stdio.h> /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( char *string, int number ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
/* * p-004-main.c : p-004 の main 関数 */ #include <stdio.h> /* any_function のプロトタイプ宣言 */ extern double any_function ( char *string, int number ); /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); /* 引数の順は元まま */ printf ( "返り値 : %f\n", ret ); /* printf を利用している -> #include <stdio.h> が必要 */ return 0; }
/* * p-004-sub.c : p-004 の any_function */ #include <stdio.h> /* * 関数 any_function * double any_function ( int number, char *string ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( int number, char *string ) { /* 引数の順番をかえた */ /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
/* * 2013/11/08 sample-001.c */ /* * 二つの関数からなるプログラム * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( int number, char *string ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ } /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); printf ( "返り値 : %f\n", ret ); return 0; }
/* * 2013/11/08 sample-001.c */ /* * 二つの関数からなるプログラム * * 利用方法 * コンパイル * cc -Ic:\usr\c\include -o sample-001.exe sample-001.c * 実行 * sample-001 */ #include <stdio.h> /* * 関数 any_function * double any_function ( char *string, int number ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( int number, char *string ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ } /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( 1234, "xyz" ); printf ( "返り値 : %f\n", ret ); return 0; }
/* * p-007-main.c : p-007 の main 関数 */ #include <stdio.h> /* any_function のプロトタイプ宣言 */ extern double any_function ( int number, char *string ); /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); /* 引数の順は元まま */ printf ( "返り値 : %f\n", ret ); /* printf を利用している -> #include <stdio.h> が必要 */ return 0; }
/* * p-007-sub.c : p-007 の any_function */ #include <stdio.h> /* * 関数 any_function * double any_function ( int number, char *string ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( int number, char *string ) { /* 引数の順番をかえた */ /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
/* * p-008-main.c : p-008 の main 関数 */ #include <stdio.h> #include "p-008-sub.h" /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); /* 引数の順は元まま */ printf ( "返り値 : %f\n", ret ); /* printf を利用している -> #include <stdio.h> が必要 */ return 0; }
/* * p-008-sub.c : p-008 の any_function */ #include <stdio.h> #include "p-008-sub.h" /* * 関数 any_function * double any_function ( int number, char *string ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( char *string, int number ) { /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
/* * p-009-main.c : p-009 の main 関数 */ #include <stdio.h> #include "p-009-sub.h" /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); /* 引数の順は元まま */ printf ( "返り値 : %f\n", ret ); /* printf を利用している -> #include <stdio.h> が必要 */ return 0; }
/* * p-009-sub.c : p-009 の any_function */ #include <stdio.h> #include "p-009-sub.h" /* * 関数 any_function * double any_function ( int number, char *string ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( int number, char *string ) { /* 引数の順を変更した */ /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
/* * p-010-main.c : p-010 の main 関数 */ #include <stdio.h> #include "p-010-sub.h" /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( "xyz", 1234 ); /* 引数の順は元まま */ printf ( "返り値 : %f\n", ret ); /* printf を利用している -> #include <stdio.h> が必要 */ return 0; }
/* * p-010-sub.c : p-010 の any_function */ #include <stdio.h> #include "p-010-sub.h" /* * 関数 any_function * double any_function ( int number, char *string ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( int number, char *string ) { /* 引数の順を変更した */ /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
/* * p-011-main.c : p-011 の main 関数 */ #include <stdio.h> #include "p-011-sub.h" /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( 1234, "xyz" ); /* 引数の順番を変更 */ printf ( "返り値 : %f\n", ret ); /* printf を利用している -> #include <stdio.h> が必要 */ return 0; }
/* * p-011-main2.c : p-011 の main 2 関数 */ #include <stdio.h> #include "p-011-sub.h" /* * main (関数を呼ぶだけ) */ int main( int argc, char *argv[] ) { double ret; ret = any_function ( 12345, "xyzABC" ); printf ( "返り値 : %f\n", ret ); return 0; }
/* * p-011-sub.c : p-011 の any_function */ #include <stdio.h> #include "p-011-sub.h" /* * 関数 any_function * double any_function ( int number, char *string ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( int number, char *string ) { /* 引数の順を変更した */ /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n", string, number ); return number/3.0; /* 返り値 */ }
/* * p-012-sub.c : p-012 の any_function */ #include <stdio.h> #include "p-012-sub.h" /* * 関数 any_function * double any_function ( int number, char *string ) * 指定された文字列と整数値を表示し、返り値として、 * 指定された数の 3 分の 1 の値を浮動小数点数として返す。 * # 関数としては、全く意味のない関数 * char *string : 表示する文字列 * int number : 表示する整数 * 返り値 : number の 3 分の 1 */ double any_function ( int number, char *string ) { /* 引数の順を変更した */ /* 引数の表示 */ printf ( "文字列 : %s, 整数値 : %d\n\n\n", string, number ); return number/3.0; /* 返り値 */ }
2013/11/08 講議メモ p-001.c #include <stdio.h> any_function の定義 printf を利用している -> stdio.h が必要 main の定義 printf を利用している -> stdio.h が必要 p-002-main.c #include <stdio.h> main の定義 printf を利用している -> stdio.h が必要 p-002-sub.c #include <stdio.h> any_function の定義 printf を利用している -> stdio.h が必要 p-002.exe では正しくない結果になった main が any_function の事がわからなくなったから p-003-main.c #include <stdio.h> any_function のプトロタイプ宣言を行った 関数の頭部の前に extern をいれ、最後(とじかっこの後ろ) にセミコロンを入れる。 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- extern double any_function ( char *string, int number ); -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- main の定義 printf を利用している -> stdio.h が必要 p-003-sub.c #include <stdio.h> any_function の定義 printf を利用している -> stdio.h が必要 p-003.exe では、正しく動いた p-004-main.c p-003-main.c とまったく同じ p-004-sub.c p-003-sub.c で引数を変更した コンパイルの時にはエラーにならない リンク時にもエラーにならない 実行時にエラーになった p-005.c 基本は p-001.c と同じ ただし、any_function の引数の順を変更した -> 「コンパイル時」にエラーがおきる 原因 : 関数の定義の引数の順を変更した のに、関数の呼出しの引数の順は元のまま p-006.c p-005.c で呼出し側も順番を揃えた -> ただしく動く p-007-sub.c p-004-sub.c と同じ p-007-main.c p-004-main.c と同じで、プロトライプ宣言を修正 コンパイル時にエラーになる == p-008-sub.h プロトタイプ宣言だけをいれる p-008-sub.c #include "p-008-sub.h" を追加 p-008-main.c プロトタイプ宣言の代りに #include "p-008-sub.h" を入れる ポイント p-008-main.c と p-008-sub.c では関数 any_function の型(プロトタイプ宣言の情報)に関して、 「合意」する必要がある 一方だけにそれを記述していると、 他方が書き変わった時に、破綻がおきる 共通項目を p-008-sub.h という共通のファイルに 保存し、それを相互に利用する事する p-009-sub.h p-009-sub.c 引数を変更する p-009-sub.h の中のプロトタイプと p-009-sub.c の中の関数宣言がくいちがうので コンパイルエラー p-009-main.c p-010-sub.h p-010-sub.c にあわせる p-010-sub.c p-009-sub.c と同じ p-010-main.c p-010-sub.h の中のプロトタイプと p-010-main.c の中の関数利用がくいちがうので コンパイルエラー p-011-sub.h p-010-sub.h と同じ p-011-sub.c p-010-sub.c と同じ p-011-main.c 関数の呼出し方を p-011-sub.h にあわせる 新しいルールで統一されたので、全部上手く行く 「統一」に関しては、コンパイラがチェックしてくれる == 一つのファイルでの開発 ファイルは p-001.c 一つでよい コンパイルは cc -o p-001.exe p-001.c 複数のファイルでの開発 ファイルは p-011-main.c p-011-sub.c p-011-sub.h の三つ コンパイルは cc -c p-011-main.c cc -c p-011-sub.c cc -o p-011.exe p-011-main.o p-011-sub.o # デメイット(よくない点) 一つ一つが小くなるので、解りやすくなる # 関数を作ったから(フィアルを分けたからではない) 変更もしやすい ファイルの変更をする場合に、 変更に関係する部分しかない(善し悪しではあるが..) 事が多い 再利用もしやすい p-011-main2.c p-011-main.c を改造した版 p-011-2.exe を作る時に p-011-sub.c (p-011-sub.o) p-011-sub.h がそのまま再利用できた !! make と Makefile の話 ファイルを分割すると、コンパイルの作業の手間が増える これを自動化する仕組が欲い ver 1. バッチファイル 命令の並びを .bat という拡張子のファイルにいれ その名前を指定するだけで、その命令が全て実行される ver 2. make と makefile の利用
Makefile作成し、それを20131108-QQQQ.mkとして提出する。