プログラム初心者がよくやるエラーを体験しよう

概要

最終更新日:2020/02/23

プログラム初心者の人達がよくやるエラーについて書いた記事です。
主に次の項目に該当する方に向けて書いています。
  • エラー情報の見方が分からない
  • 修正の仕方が分からない
  • エラーを体験してみたい

サンプル

サンプルはここからダウンロードできます。
環境については以下の内容となっています。

開発環境
VSのバージョン VisualStudio 2019
使用言語 C/C++
説明 実行したらvalue = 100と表示されます


準備

今回のエラー体験はC/C++言語を使って行います。
サンプルをDLしてプロジェクトを開いてください。
もしくは新規プロジェクトを作成して、以下のコードをコピー&ペーストしてください。

#include <stdio.h>

int main(void)
{
	int value = 100;

	if (value == 100)
	{
		printf("value = %d\n", value);
	}

	return 0;
}

言語が違っても起こりやすいエラーを集めていますので、
使用している言語や環境に置き換えてやってみてください。

エラー情報

ほとんどの開発環境はエラー原因を教えてくれます。
例えばVisualStudioは以下の方法で教えてくれます。
  • リアルタイム
  • ビルド実行時

リアルタイム

命令文などでエラーがあった場合はリアルタイムでエラー部分を教えてくれます。
エラーになっている部分は赤線が引かれます。

2d_game_0029

赤線の上にマウスカーソルを持っていくとエラー内容まで教えてくれます。

2d_game_0030

ビルド実行時

ビルド実行時にエラーになった場合は、ダイアログで教えてくれます。

2d_game_0031

エラー情報はエラー一覧ウィンドウで場所と内容を確認できます。

2d_game_0032

番号 項目名 説明
説明 エラーの詳細
この部分を参考にしてエラーを修正する
プロジェクト エラーが発生したプロジェクト名
ファイル エラーが発生したファイル名
エラーが発生した行番号

エラーの修正ポイント

エラー修正時は以下のポイントを気を付けます。
  • 場所
  • エラー詳細
初心者の人はエラーが発生したら必ず場所とエラーの詳細をエラー一覧や
エラー場所にカーソルに合わせて確認してください。

エラー体験概要

今回、体験してもらうエラーは以下の通りです。
  • 全角文字を使う
  • 「;」がない
  • 「{」と「}」が対になっていない
  • 変数の宣言をしていない
  • 関数の中にない
正常に動作するプログラムをわざとエラーになるように変更していくので
変更前と変更後の違いをきちんと確認してください。

注意点

各項目の体験を行う場合、他の項目で変更したエラーコードは
そのままにせずに一度正常な状態に戻してください。
戻し方は「準備」にあるコードをコピー&ペーストするか、
自分で修正(変更前に戻す)を行ってみてください。

全角文字を使う

プログラムの文字は半角で入力することが基本です。
それではコードの内容を以下のように変更して実行してみてください。

// vを半角から全角に変更
int value = 100; 

実行すると以下のような赤線が引かれてエラーになります。

2d_game_0033

全角文字を使用した場合、半角文字とは別の文字として扱われます。
その為、半角のみ「value」と全角が混じった「value」はコンピュータが
別の変数として認識するため、エラー内容が「value」が宣言されていないことを示す
未定義エラーであることを教えてくれます。

また、全角はスペースも含まれますので、気をつけてください。
次のコードのようにintとvalueの間を全角スペースに変更後、実行してください。
// intとvalueの間を全角スペースに変更
int value = 100;

エラーは以下のようになります。

2d_game_0034

全角スペースの場合は内容が「認識されないトークン」と出ます。
トークンとはプログラムの文字の並びの事です。
全角スペースを使用することで、プログラムの文字の並びがおかしくなり、
今回のエラーが表示さています。

「;」がない

プログラムの命令文の終端には「;」が必要です。
しかし、プログラムを始めたばかりの頃は忘れてしまいがちです。
次のコードのようにprintfの最後の行の「;」を消して実行してください。

// 「;」を消す
printf("value = %d\n", value)

「;」がない場合のエラーは以下のようになります。

2d_game_0035

「;」がないエラーはprintfの末尾をエラー場所とせずに、
次の行以降をエラー場所として扱います。
今回のエラーでは赤枠のprintfの末尾ではなく、
次の行の青枠で囲っている「}」がエラーの場所として指定されています。
これは「;」(命令文の終わり)がないため、命令文が終わらずに
次の命令文と結合しているため、文法エラーとして認識されています。

このエラーのように、エラー原因の場所は赤線や指定されている場所ではなく、
その前の行にある可能性があるので注意してください。

「{」と「}」が対になっていない

プログラムは「ブロック」と呼ばれるコードがまとまっている場所があります。
ブロックはCやC++等多くの言語では「{」と「}」で囲っており、
この二つの記号は絶対にセットになっていないといけません。
今回のコードではmain関数のブロック(赤枠)とif文のブロック(青枠)があります。

2d_game_0036

では、次のコードのようにif文の終わりの「}」をコメントアウトしてください。
※コメントアウトとはプログラムの一部をコメントにすることです。

if (value == 100)
{
	// 「;」を消す
	printf("value = %d\n", value)
// 「}」をコメント
// }

コメントした場合のエラー内容は以下のようになります。

2d_game_0037

「}」をコメントにすることで、if文の「{」と対になる「}」が見つからないため、
エラー説明の「'{': 一致するトークンが見つかりませんでした」と表示されます。

変数の宣言をしていない

変数を使用する時は宣言をしないとコンピュータが変数を用意していないため、
代入や参照を行っても変数が存在していないので、アクセス違反になります。
では、以下のコードのようにvalueを宣言している行をコメントアウトしてください。

// 宣言をコメント
//int value = 100;

if (value == 100)
{
	printf("value = %d\n", value);
}

宣言をコメントにした場合のエラー内容は以下のようになります。

2d_game_0038

変数宣言をコメントにした場合、if文で使用しているvalueは
「定義されていない」意図が不明な文字列として扱われます。
その為、不明な文字列を変数として扱おうとしてエラーになっています。

関数の中にない

プログラムの命令文は基本的にどこかの関数の中で書かなければいけません。
そうしないと、プログラム実行時に命令を実行できないからです。
例えば次のコードのようにブロックの外にif文を移動したらエラーになります。

int value = 100;

if (value == 100)
{
	printf("value = %d\n", value);
}

int main(void)
{

	return 0;
}

プログラムは関数を指定して実行し、その中の命令文が一つずつ実行されますが、
上のコードのif文は関数の外にあるため、どうやってもif文が実行できず、
エラーとして扱われています。