プログラミング作法と デバッグ ― VC++ 編 ― プログラミング作法 字下げ(インデント) 注釈(コメント) 名前のつけ方 初心者 モジュラー化 非対話化 – フィルタ(リダイレクト、パイプ) – コマンドラインオプション 配列の動的確保 中級者 字下げ(インデント) 対等な関係にある文は同じ桁位置に 制御文(if文, case文, while文, do文, for 文)の内部の単文は字下げ(2文字分) { と } の内部も字下げ(2文字分) Tabキーは使わない(タブ数=8に) オートインデントは使わない – 他のエディタでの印刷時に不揃いの可能性 注釈(コメント) // は一行コメントに /* … */ は複数行コメントに → 無効化 日本語(または英語)でわかりやすく プログラムや関数のはじめに – 目的、内容、参考文献 – 前提条件、制限事項 – 作成日時、作成者 プログラムや関数の最後に – //プログラム名、//関数名 「今日の自分は、明日の他人」 名前のつけ方 役割を反映する簡潔な名前をつける ローマ字は避け、英語にする 広範囲に使う名前は長く、局所で使う名 前は短く 長い名前を短くする方法 – 最初の数個の文字 int, str, info, sci, com – 母音を省略 msg, ctrl, cnt, chg, ltd 名前のつけ方(その2) 大文字と小文字をうまく使い分ける – ユーザ定義定数は大文字で始める Pi, Epsilon – ユーザ定義データ型は大文字で始める Point, Vector – 汎用変数は小文字で始める 2つ以上の単語の区切りは明確化 – threeWordName 型によって使う文字を決める – 整数型の添え字は i, j, k,… – 整数型の定数は N, M, L を含める MaxN – 状態(論理変数)はis+大文字始まり isEven, isPrime デバッグのコツ コンパイラ・メッセージの利用 ランタイム・エラーとその原因 よくやるミス 見つけにくいバグ コンパイラ・メッセージ コンパイル情報 ファイル名(行, 桁): メッセージコード: 内容 – error: エラー – warning: 警告 コンパイル結果情報 – /out:???.exe: 実行形式ファイル – ???.obj: オブジェクトファイル 頻度の高いエラー・メッセージ 以下のエラーの意味をよく理解しておく – – – – – – – 構文エラー 定義されていない識別子です。 文字 ‘0x81’ は認識できません。 再定義されています。 関数には戻り値が必要です。 実引数が少なすぎます。 互換性のない型が含まれています。 ランタイム・エラー 制限オーバー – 0で除算、負の平方根・対数 – オーバーフロー、アンダーフロー スタック・オーバーフロー – 再帰的定義など ハングアップ → [Ctrl-c] で強制終了 – 無限ループなど 対策: 途中経過を報告させる – どこまで正常に終わったかを出力 – あやしい変数の値を出力 よくやるミス スペルミス 変数の宣言忘れ カッコのとじ忘れ セミコロンのつけ忘れ 文字列のシングルクォートとコンマ 予約語、宣言済み名前との競合 ソースファイル名の異常 コンパイル時の自動保存による失敗 見つけにくいバグ セミコロン while (式); 文; 2バイト(全角)文字の混入 – スペース(空白) – コンマ、カッコ、; 、: 、’ … コメントの入れ子 – /* /* */ */ → /* // */ 字下げとフォントの設定 devenv(Visual Studio のエディタ)において「ツール」→ 「オプション」→「テキストエディタ」→「C/C++」で「タブサ イズ」、「インデントサイズ」をおのおの4にセットし、「空 白の挿入」欄をチェックする。 Tabキーを時々、使いながらプログラムソースを入力。 ファイル名を ???.c として保存する。 Word(Notepad)で表示(印刷)してインデントの乱れが ないか、確認する。 Wordの場合はMS ゴシックなどの等幅フォントを指定す る。MS PゴシックなどPがつくフォントにはしないこと。 欧文フォントでは Courier New を用いるとよい。 デバッグの練習1 /* while の無限ループの練習 */ int main(void) { int a; printf("整数を入力 > "); scanf("%d", &a); while (a > 0); { a = a - 1; printf("%4d\n", a); } } // while.c デバッグの練習2 /* ランタイム・エラーの練習 */ #include <stdio.h> #define PI 3.141592 int main(void) { double x; x = sqrt(PI); printf("sqrt(PI) = %f\n", x); x = sqrt(-PI); printf("sqrt(-PI) = %f\n", x); } // sqrt.c オプション問題 以下のプログラムを実行し、整数を入力したら、途中 停止せずに終わってしまった。どこを直せばよいか。 /* 途中停止の練習 */ int main(void) { int i; char c; printf("整数を入力 > "); scanf("%d", &i); printf("i = %d\n", i); printf("リターンキーを押してください."); c = getchar(); }
© Copyright 2024 ExpyDoc