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

C言語入門

N/A
N/A
Protected

Academic year: 2021

シェア "C言語入門"

Copied!
16
0
0

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

全文

(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 型のビット数 CHAR_MIN 0 または SCHAR_MIN

(4)

標準ヘッダ: <float.h>

• 浮動小数点型に関する定数は以下のマクロ

で定義されている

float double 指数表現の基数 FLT_RADIX DBL_RADIX 精度の10進桁数 FLT_DIG DBL_DIG

仮数部における基数(RADIX)の桁数 FLT_MANT_DIG DBL_MANT_DIG

1.0 + 𝑥 ≠ 1.0となる最小の𝑥 FLT_EPSILON DBL_EPSILON

最大値 FLT_MAX DBL_MAX

正規化された最小の浮動小数値 FLT_MIN DBL_MIN

RADIX𝑛 − 1が表現可能な𝑛の最大値 FLT_MAX_EXP DBL_MAX_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)と呼ばれる 多言語化の仕組み

(7)

mintty の locale の設定

• mintty左上のアイコンからoption→Text

ここに

Locale: ja_JP

Cahaacter set: UTF-8 を設定して「OK」しておく

(8)

文末の「;」忘れ

• 文末に「;」を忘れると次の文字でエラーに

error1.c int main() { printf("hello, ") printf("world¥n"); return EXIT_SUCCESS; } 4 5 6 7 8 9 10

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)

ブロック開始終端の不整合

• 「{」が1つ多い

error2_1.c int main() { { printf("hello, world¥n"); return EXIT_SUCCESS; } 4 5 6 7 8 9 10

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 }

^

(10)

ブロック開始終端の不整合

• 「}」が1つ多い

エラーが生じたのは8行目の3文字目だが、エラーの原因は7行目。 「}」が1つ多いので、main関数の定義が7行目で終わっている。 つまり、8~9行目は、何もないところにいきなり以下のように書いたのと同じ。 return EXIT_SUCCESS; } 8 9 error2_2.c int main() { printf("hello, world¥n"); } return EXIT_SUCCESS; } 4 5 6 7 8 9

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 }

(11)

ブロック開始終端の不整合

• 関数名のミススペル

コンパイルではなくリンクに失敗したと言われている。 分割コンパイルによる、外部関数のリンクの際、print が見つからなかった。 printf のつもりが print とミススペルしている。 標準ライブラリに print 関数は用意されていない。 error3.c int main() { print("hello, world¥n"); return EXIT_SUCCESS; } 4 5 6 7 8 9

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 で終了しました コンパイルフェーズではなくリンクフェーズでのエラー。 ~.o ファイルについて参照がみつからないと言われている。

(12)

不要な ;

• 関数定義がプロトタイプ宣言になっている

main() の直後に ; があるのでそこで文が終わっている。 このため、関数の定義ではなく、関数のプロトタイプ宣言になっている。 error4.c int main(); { printf("hello, world¥n"); return EXIT_SUCCESS; } 4 5 6 7 8 9

mintty + bash + GNU C

$ gcc error4.c

error4.c:5:1: エラー: expected identifier or ‘(’ before ‘{’ token {

(13)

ファイルが見つからない

• ファイル名や配置場所を確認する

#include しようとしたファイルが見つからない。

#include に与えたファイル名か、ファイルに付けた名前のどちらかが間違っている。 上記の例では stdlib.h が正しいが lib ではなく ilb になっている。

error5.c #include <stdio.h> #include <stdilb.h> int main(); { printf("hello, world¥n"); return EXIT_SUCCESS; } 1 2 3 4 5 6 7 8 9

mintty + bash + GNU C

$ gcc error5.c

error5.c:2:20: 致命的エラー: stdilb.h: No such file or directory #include <stdilb.h>

^ コンパイルを停止しました。

(14)

C言語のコンパイル

• コンパイラにより実行形式に変換する

.h ファイル .h ファイル .h ファイル Source files .c ファイル .c ファイル .c ファイル .o ファイル .o ファイル .o ファイル Object files ライブラリ ライブラリ ライブラリ 実行ファイル Executable files C compiler Preprocessor linker C compiler Cコンパイラは実際には preprocessor compiler linker の3段階に分かれている

(15)

エラー時の対処方法

• エラーメッセージをよく読みましょう。

• 行番号と何文字目かも参考になります。

• 同じようなエラーメッセージなら、同じような原

因である可能性が高いはずです。

• 原因が分からない場合は、エラーメッセージ

を Google 等の検索エンジンで検索しましょう。

(16)

参考文献

• [1] B.W.カーニハン/D.M.リッチー著 石田晴久

訳、プログラミング言語C 第2版 ANSI 規格準

拠、共立出版(1989)

参照

関連したドキュメント

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

のようにすべきだと考えていますか。 やっと開通します。長野、太田地区方面  

画像の参照時に ACDSee Pro によってファイルがカタログ化され、ファイル プロパティと メタデータが自動的に ACDSee

①アプリをアンインストール スタート > 設定 > アプリ > アプリと機能 > Docan Browser5. ②関連ファイル削除(1)

Lane and Bands Table と同様に、Volume Table と Lane Statistics Table も Excel 形式や CSV

ダウンロードしたファイルを 解凍して自動作成ツール (StartPro2018.exe) を起動します。.

その職員の賃金改善に必要な費用を含む当該職員を配置するために必要な額(1か所

QRされた .ino ファイルを Arduino に‚き1む ことで、 GUI |}した ƒ+どおりに Arduino を/‡((スタンドアローン})させるこ とができます。. 1)