スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
目次
はじめに
備忘録もかねてどのようなパターンでプログラムがエラーを吐くかメモを残しておく。
※私が今まで使ったことのあるプログラムの環境は「MinGW」と「Visual Studio」
単純な付け忘れ
文章の最後に「;」(カンマ)を付け忘れる。
「;」(カンマ)と「:」(コロン)を間違える。
「{}」(かっこ)がきちんと閉じていない。
※「{」と「}」の数が同じでない
ひらがなモードで空白(space)の挿入。
※Ctrl+Fなどでプログラムの中に、余計な空白がないか検索できる
※「Visual Studio」には、インテリセンス機能がついているので、赤線で警告してくれるからすぐに気づける。
配列のミス
配列は非常にミスをしやすい部分である。
コンパイルがうまくいったのに、実行しようとすると止まるときは、まず配列を疑う。
例えば、c#で、int []array= new int [10];と宣言すると、10個の要素が宣言される。
この場合、配列の中身は、array[0]~array[9]で指定する。
生活をしていると、ほとんど多くの物事は1からスタートしてラベル付けがされる。だが、配列に関しては、0からスタートしてラベル付けされる。このため余計、間違えやすい。つまり、array[0]~array[9]でなく、array[1]~array[10]が存在していると勘違いしてしまいがち。
特に、最大値の部分はうっかりするとミスる。
例えば以下のようなプログラムはバグる。
※「Visual Studio」のコンソールアプリケーションで作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int array_max; array_max= 10; int []array= new int [array_max]; array[array_max] = 100; Console.WriteLine(array[array_max]); } } } |
ハンドルされていない例外: System.IndexOutOfRangeException: インデックスが配列の境界外です。
と警告を受ける
正しいプログラムは以下のようになる。
array[array_max]をarray[array_max-1]にする必要がある
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace error1_OK { class Program { static void Main(string[] args) { int array_max; array_max = 10; int[] array = new int[array_max]; array[array_max-1] = 100; Console.WriteLine(array[array_max-1]); } } } |
数字の切り捨て(キャスト)
int で数字を扱っている時に、割り算が入る場合は要注意。
例えば以下のプログラムでは正しい答えは得られず0になる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace error2 { class Program { static void Main(string[] args) { int x = 50; int y;//消費税 y = x / 100 * 8; Console.WriteLine(x+"円の消費税は" + y+"円"); } } } |
yは4になりそうだが、プログラムの結果は0になる。
これは先に、「x / 100」の部分が評価されているためだ。
50/100は0.5で、intで扱っているため切り捨てられて、0になる。
その後、「*8」して×8をしているが、0に8をかけても0である。
正しくは、以下のように、xを「int」でなく「double」として最初は扱ったのちに、型を「int」に戻す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace error2_ok { class Program { static void Main(string[] args) { int x = 50; int y;//消費税 y = (int) ((double)x /100 * 8); //y = (int)(x * 0.08);//これでも可能 Console.WriteLine(x+"円の消費税は" + y+"円"); } } } |
関連記事
~Webサイトを自分で作ってみませんか?~
Webサイトを運営するにはサーバーが必須です。
このサイトは、エックスサーバー のサーバーを使用しています。
エックスサーバーは無料で10日間お試しができます。