1 C 言語入門 第 10 週 プログラミング言語 Ⅰ( 実習を含む ), 計算機言語 Ⅰ 計算機言語演習 Ⅰ, 情報処理言語 Ⅰ( 実習を含む )
基本型 2
3 標準ヘッダ : <limits.h> 整数型の最小値 最大値は以下のマクロで定義されている unsigned signed 最小値最大値最小値最大値 char 0 UCHAR_MAX SCHAR_MIN SCHAR_MAX short 0 USHRT_MAX SHRT_MIN SHORT_MAX int 0 UINT_MAX INT_MIN INT_MAX long 0 ULONG_MAX LONG_MIN LONG_MAX char 型に関する定義 CHAR_BIT CHAR_MIN CHAR_MAX char 型のビット数 0 または SCHAR_MIN UCHAR_MAX または SCHAR_MAX
4 標準ヘッダ : <float.h> 浮動小数点型に関する定数は以下のマクロで定義されている float double 指数表現の基数 FLT_RADIX DBL_RADIX 精度の 10 進桁数 FLT_DIG DBL_DIG 仮数部における基数 (RADIX) の桁数 FLT_MANT_DIG DBL_MANT_DIG 1.0 + x 1.0 となる最小の x FLT_EPSILON DBL_EPSILON 最大値 FLT_MAX DBL_MAX 正規化された最小の浮動小数値 FLT_MIN DBL_MIN RADIX n 1 が表現可能な n の最大値 FLT_MAX_EXP DBL_MAX_EXP 10 n を正規化された浮動小数値として表現可能な n の最小値 FLT_MIN_EXP DBL_MIN_EXP
5 エラーメッセージを読みエラーの原因を推測しましょう 良くあるエラーの例
6 gcc のエラーメッセージ 環境変数 LANG を設定すると言語が変わる mintty + bash + GNU C $ LANG=C gcc error1.c error1.c: In function 'main': error1.c:7:3: error: expected ';' before 'printf' printf("world n"); ^ mintty + bash + GNU C $ LANG=ja_JP.UTF-8 gcc error1.c error1.c: 関数 main 内 : error1.c:7:3: エラー : expected ; before printf printf("world n"); ^ ロケール (locale) と呼ばれる多言語化の仕組み JM: locale (7)
7 mintty の locale の設定 mintty 左上のアイコンから option Text ここに Locale: ja_jp Cahaacter set: UTF-8 を設定して OK しておく
8 文末の ; 忘れ 4 5 6 7 8 9 10 文末に ; を忘れると次の文字でエラーに error1.c int main() { printf("hello, ") printf("world n"); return EXIT_SUCCESS; mintty + bash + GNU C $ gcc error1.c error1.c: 関数 main 内 : error1.c:7:3: エラー : expected ; before printf printf("world n"); ^ エラーが生じたのは 7 行目の 3 文字目だが エラーの原因は 6 行目の行末 C 言語では スペースや改行は人間に読み易くするための位置調整に過ぎないので printf("hello, ") printf("world n"); は printf("hello, ")printf("world n"); と同じ意味 ここに ; があるべきだが ; の前に p が現れたことがエラーの原因
9 ブロック開始終端の不整合 4 5 6 7 8 9 10 { が 1 つ多い error2_1.c int main() { { printf("hello, world n"); return EXIT_SUCCESS; mintty + bash + GNU C $ gcc error2_1.c error2_1.c: 関数 main 内 : error2_1.c:10:1: エラー : expected declaration or statement at end of input ^ が 1 つ足らない状態で ファイルの終端 ( 入力の終端 ) に達している
10 ブロック開始終端の不整合 4 5 6 7 8 9 が 1 つ多い error2_2.c int main() { printf("hello, world n"); return EXIT_SUCCESS; mintty + bash + GNU C $ gcc error2_2.c error2_2.c:8:3: エラー : expected identifier or ( before return return EXIT_SUCCESS; ^ error2_2.c:9:1: エラー : expected identifier or ( before token ^ エラーが生じたのは 8 行目の 3 文字目だが エラーの原因は 7 行目 が 1 つ多いので main 関数の定義が 7 行目で終わっている つまり 8~9 行目は 何もないところにいきなり以下のように書いたのと同じ 8 9 return EXIT_SUCCESS;
11 ブロック開始終端の不整合 4 5 6 7 8 9 関数名のミススペル error3.c int main() { print("hello, world n"); return EXIT_SUCCESS; mintty + bash + GNU C $ gcc error3.c /tmp/ccopikhp.o:error3.c:(.text+0x15): `print' に対する定義されていない参照です /tmp/ccopikhp.o:error3.c:(.text+0x15): 再配置がオーバーフローしないように切り詰められました : R_X86_64_PC32 ( 未定義シンボル `print' に対して ) /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../x86_64-pc-cygwin/bin/ld: /tmp/ccopikhp.o: 誤った再配置アドレス 0x0 がセクション `.pdata' 内にあります /usr/lib/gcc/x86_64-pc-cygwin/4.8.2/../../../../x86_64-pc-cygwin/bin/ld: 最終リンクに失敗しました : 無効な操作です collect2: エラー : ld はステータス 1 で終了しました コンパイルではなくリンクに失敗したと言われている 分割コンパイルによる 外部関数のリンクの際 print が見つからなかった printf のつもりが print とミススペルしている 標準ライブラリに print 関数は用意されていない コンパイルフェーズではなくリンクフェーズでのエラー ~.o ファイルについて参照がみつからないと言われている
12 不要な ; 4 5 6 7 8 9 関数定義がプロトタイプ宣言になっている error4.c int main(); { printf("hello, world n"); return EXIT_SUCCESS; mintty + bash + GNU C $ gcc error4.c error4.c:5:1: エラー : expected identifier or ( before { token { ^ main() の直後に ; があるのでそこで文が終わっている このため 関数の定義ではなく 関数のプロトタイプ宣言になっている
13 ファイルが見つからない 1 2 3 4 5 6 7 8 9 ファイル名や配置場所を確認する error5.c #include <stdio.h> #include <stdilb.h> int main(); { printf("hello, world n"); return EXIT_SUCCESS; mintty + bash + GNU C $ gcc error5.c error5.c:2:20: 致命的エラー : stdilb.h: No such file or directory #include <stdilb.h> ^ コンパイルを停止しました #include しようとしたファイルが見つからない #include に与えたファイル名か ファイルに付けた名前のどちらかが間違っている 上記の例では stdlib.h が正しいが lib ではなく ilb になっている コンパイルフェーズではなく プリプロセスフェーズでのエラー
14 C 言語のコンパイル コンパイラにより実行形式に変換する Source files.h ファイル.h ファイル.h ファイル C compiler Preprocessor C コンパイラは実際には preprocessor compiler linker の 3 段階に分かれている Object files C compiler.c ファイル.c ファイル.c ファイル.o ファイル.o ファイル.o ファイル linker Executable files 実行ファイル ライブラリライブラリライブラリ
15 エラー時の対処方法 エラーメッセージをよく読みましょう 行番号と何文字目かも参考になります 同じようなエラーメッセージなら 同じような原因である可能性が高いはずです 原因が分からない場合は エラーメッセージを Google 等の検索エンジンで検索しましょう
16 参考文献 [1] B.W. カーニハン /D.M. リッチー著石田晴久訳 プログラミング言語 C 第 2 版 ANSI 規格準拠 共立出版 (1989)