見出し画像

高校数学をプログラミングで解く(準備編)「1-5 バグへの対処」

マガジンリスト > 準備編 1.プログラム基礎 > 1-5 バグへの対処


はじめに

今回は、「高校数学をプログラミングで解く」を始めるための準備として、プログラムを書いていると必ずと言っていいほど発生するバグへの対処法について説明しておきます。

バグは必ず出てくる

アルゴリズムを考え、苦労してプログラミングしていざ実行するとエラーが出て動かない・・・。プログラミングをしていると、必ずと言っていいほどこの現象が起こります。この主な原因はプログラムの不具合「バグ」です。初心者の方だけでなく、ベテランのプログラマーでも、プログラムを作成するたびにバグを発生させます。もしプログラムが動かなくても焦らず、いらいらせずに冷静に対処していきましょう。

よく起こるバグ

ここでは、プログラミングをしているとしばしば起こしてしまうバグについて説明します。

セミコロンを忘れている

結構起こしてしまいがちなバグです。実際に簡単な例で示してみます。

void setup(){
  int a = 1
  println(a);
}

ソースコード1 「int a = 1」の右側にセミコロンがない場合

ソースコード1は整数型の変数aに1を代入して、aの値をコンソールに出力するプログラムとなっていますが、「int a = 1」の右側にセミコロンを忘れています。これを、Processingの開発環境ウィンドウを開いて(スケッチ名を「bug_test」としています)、テキストエディタ部分に書いて実行します。

図1 セミコロンを忘れた場合のエラー

図1のように、メッセージエリア(赤い部分)とコンソールに『"";"がありません"でエラー』とエラーメッセージが表示されます。これは、ソースコードのどこかにセミコロンを忘れていることを示しています。ですので、セミコロンを忘れている部分にセミコロンを追加しましょう。

全角スペースが入っている

これも発生させがちなバグです。実際に再現してみます。

void setup(){
 int a = 1;
  println(a);
}

ソースコード2 「int a = 1;」の左側に全角スペースが入っている場合

ソースコード2をみてみると間違いがなさそうですが、「int a = 1;」の左側に全角スペースが入っています。これを、先ほど利用したスケッチ「bug_test」のテキストエディタ部分に書いて実行します。

図2 全角スペースが入っている場合のエラー

図2のように、メッセージエリア(赤い部分)とコンソールに『Syntax error on token "Invalid Character", delete this token』とエラーメッセージが表示されます。これは、ソースコードのどこかに全角文字などのコードに使えない文字が利用されていることを示しています。Processingの開発環境ウィンドウでは、全角スペースが入っているところに赤色の波線が入っていたり、カーソルが全角スペースが入っている行に移動するので、どこで全角スペースを利用しているかはわかりやすくなっています。

「int a = 1;」の右側に全角スペースが入った場合
ただ、「int a = 1;」の右側に全角スペースが入った場合は少し厄介です。実際に再現してみます。

void setup(){
  int a = 1; 
  println(a);
}

ソースコード3 「int a = 1;」の右側に全角スペースが入っている場合

ソースコード3も間違いがなさそうですが、「int a = 1;」の右側に全角スペースが入っています。これを、スケッチ「bug_test」のテキストエディタ部分に書いて実行します。

図3 「int a = 1;」の右側に全角スペースが入っている場合のエラー

図3のように、メッセージエリア(赤い部分)とコンソールに『"";"がありません"でエラー』とエラーメッセージが表示されます。厄介なのは、セミコロンをきちんと入れているにもかかわらず、『"";"がありません"でエラー』と出ることです。
そのため、この場合は、まずセミコロンが入っていないところがないかチェックした後、セミコロンが正しく入っていれば、全角スペースを疑ってみるという対処を行う必要があります。この場合の全角スペースの探し方としては、ソースコードの各行においてカーソルを矢印キーで左右に動かしていくと、全角スペースが入っている箇所で大きなとびが発生するので、それを目安に探していきます。

図4 カーソルを動かして全角スペースの箇所を探す

括弧が閉じていない

このバグは、括弧を多用しているプログラムを書いた場合によく起こります。これも再現してみます。

void setup(){
  int a = 1;
  println(a);

ソースコード4 右側の } を書き忘れている場合

ソースコード4は、右側の } を書き忘れています。これを、スケッチ「bug_test」のテキストエディタ部分に書いて実行します。

図5 右側の } を書き忘れている場合のエラー

図5のように、メッセージエリア(赤い部分)とコンソールに『"Incomplete statement or extra code near …』と長文のエラーメッセージが表示されます。このようなエラーメッセージが出た場合、括弧の閉じ忘れが推測されます。この閉じ忘れ箇所を探す方法としては、もし正しく括弧を閉じていればカーソルを { や } の右側に置くと対になる括弧が▢で囲われて表示されます(図6)ので、この機能を利用して正しく括弧が閉じているかを確認することができます。

図6 カーソルを { や } の右側に置くと対になる括弧が▢で囲われて表示される

左側の { を書き忘れている場合
今度は、左側の { を書き忘れている場合についても見てみます。

void setup()
  int a = 1;
  println(a);
}

ソースコード5 左側の { を書き忘れている場合

これを、スケッチ「bug_test」のテキストエディタ部分に書いて実行します。

図7 左側の { を書き忘れている場合のエラー

図7のように、メッセージエリア(赤い部分)とコンソールに『"Missing left curly bracket "{"" でエラー』とエラーメッセージが表示されます。こちらは比較的わかりやすいエラーメッセージだと思います。対処方法は右側の } を書き忘れている場合と同じ方法で対応できます。

違うデータ型の値を代入しようとしている

これは比較的わかりやすいバグです。これも再現してみます。つまり、整数型の変数aに浮動小数点数型のデータ「1.0」を代入してみます。

void setup(){
  int a = 1.0;
  println(a);
}

ソースコード6 違うデータ型の値を代入する場合

これを、スケッチ「bug_test」のテキストエディタ部分に書いて実行します。

図8 違うデータ型の値を代入する場合のエラー

図8のように、メッセージエリア(赤い部分)とコンソールに『Type mismatch: cannot convert from float to int』とエラーメッセージが表示されます。こちらも比較的わかりやすいエラーメッセージだと思います。対処方法としては、変数をどちらのデータ型で利用したいかを考えて書き換えればよいです。

タイプミス

※2024年6月9日追加

これが一番よく起こしてしまうバグかもしれません。データ型、変数名、関数名など、よくみたら名前が間違っていることがよくあります。
これを円を描くプログラムで再現してみます。ソースコード7では、circle 関数を cricle 関数と間違った名前になっています。

void setup(){
  size(400,400);
  cricle(200.0,200.0, 200.0);
}

ソースコード7 タイプミスを起こしている場合

これを、スケッチ「bug_test2」のテキストエディタ部分に書いて実行します。

図9 タイプミスした場合のエラー

図9のように、メッセージエリア(赤い部分)とコンソールに『The function cricle(float, float, float) does not exist.』とエラーメッセージが表示されます。『cricle 関数なんて存在しません』と言われています。対処方法としては、名前が間違っていないかをしっかり確認することと google で「Processing cricle」などのキーワードで検索してみることが考えられます。

その他のバグが起こったら

上記で、よく起こるバグを紹介しましたが、これらのバグ以外も起こる可能性があります。その場合は、以下のような対処が考えられます。

知識がある人に聞いてみる

知識がある人がいる場合は、聞いてみるのが一番早いでしょう。ただ、そういう聞ける人がいない場合は次の対処法を考えてみてください。

エラーメッセージで検索してみる

上記のよく起こるバグがある場合でもそうでしたが、実行してみると、メッセージエリアとコンソールに何らかのエラーメッセージが表示されます。ここで出たエラーメッセージをコピーして、googleなどで検索をかけてみると、同じエラーメッセージを出した人がどう対処したのかを解説してくれていることが多いです。そのような情報をいくつか見てみると自分のプログラムのバグにも応用できるものが見つかることがあります。

Q&Aサイトで質問してみる

エラーメッセージで検索してみてもやっぱりバグの対処法がわからない場合は、Q&Aサイトで質問してみるというのも一つの手です。OKwaveなどでは結構丁寧に回答してくれる人もいるので、どうしてもわからない場合はこの手段も考えてみましょう。

試行錯誤する

最後は、いろいろと試行錯誤してみるほかないです。
たとえば、プログラムの一部をコメントアウトして実行してみることで、とにかく動く状態になるようにします。それから、順にコメントアウトを外して実行していくと、どこの行で不具合が起こっているかがわかってきます。その行を起点にしてなぜバグが発生しているのかを確認していきます。
他にやれることとしては、ところどころにprintln文を入れて、中間データが正しい値を取っているかやそもそもどこまで正しく動いているのかなどを確認するという方法もあります。
とにかく、やれることを全部やってバグを探して対処していくということをやります。

まとめ

今回は、「高校数学をプログラミングで解く」を始めるための準備として、プログラムを書く際に発生するバグへの対処法について説明しました。
プログラミングをしていると、バグは必ずと言っていいほど発生すると思った方がよいでしょう。ですので、作成したプログラムがうまく動かなかったとしてもそこであきらめず、いろいろと試行錯誤しながら落ち着いて対応してください。

参考文献

Processingをはじめよう 第2版(オライリー・ジャパン、オーム社、ISBN9784873117737)

この記事が気に入ったらサポートをしてみませんか?