プログラミング作法と デバッグ

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