当日の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として提出する。