[解決済み] アクセス違反の読み取り場所 c++
質問
入力された数字の英語名を表示するプログラムを書いているのですが、完全なプログラムではないのに、ずっとエラーが出てしまいます。
Programming Challenge 14.1.exe の 0x00b02c76 でのファーストチャンス例外: 0xC0000005: アクセス違反の読み取り位置 0xcccccd80. Programming Challenge 14.1.exe の 0x00b02c76 での未処理例外: 0xC0000005: アクセス違反の読み取り場所 0xcccccd80.
いろいろ探してみたのですが、参考になるようなものは見つかりませんでした。
ヘッダーファイルがあります。
#ifndef NUMBERS_H
#define NUMBERS_H
#include <string>
using namespace std;
const int SIZE1 = 18;
const int SIZE2 = 8;
class Numbers
{
private:
int number;
string hundred;
string thousand;
string * one;
string * ten;
public:
Numbers(int num)
{
number = num;
hundred = "hundred";
thousand = "thousand";
string * one = new string[SIZE1];
string * ten = new string[SIZE2];
}
void initializeArray()
{
// Intialize array "one"
one[0] = "zero";
one[1] = "one";
one[2] = "two";
one[3] = "three";
one[4] = "four";
one[5] = "five";
one[6] = "six";
one[7] = "seven";
one[8] = "eight";
one[9] = "nine";
one[10] = "eleven";
one[11] = "twelve";
one[12] = "thirteen";
one[13] = "fourteen";
one[14] = "fifteen";
one[15] = "sixteen";
one[16] = "seventeen";
one[17] = "eighteen";
one[18] = "nineteen";
// Initialize the ten array
ten[0] = "ten";
ten[1] = "twenty";
ten[2] = "thirty";
ten[3] = "forty";
ten[4] = "fifty";
ten[5] = "sixty";
ten[6] = "seventy";
ten[7] = "eighty";
ten[8] = "ninety";
}
string determine()
{
string name = "";
for (int i = 0; i <= number; i++)
{
if (number == i)
{
name = one[i];
}
}
return name;
}
~Numbers()
{
delete [] one;
delete [] ten;
}
};
#endif
そしてこれがメインプログラムです。デバッグを少し速くするために、コンストラクタを使って数値に値を代入しています。
#include <iostream>
#include "Numbers.h"
using namespace std;
int main()
{
Numbers n(5);
string name = n.determine();
cout << "The number is " << name << endl;
cin.ignore();
cin.get();
return 0;
}
ちなみにこれはコンパイラのvc++です。
これはあまり整理されていないので、どんな質問にも答えます。
解決するには?
ここでは2つのことを説明します。
initializeArray()」を全く呼んでいない。そのため、配列にアクセスしようとすると、そこには何もありません。コンストラクタの中で呼び出すことをお勧めします。このように。
Numbers(int num)
{
number = num;
hundred = "hundred";
thousand = "thousand";
one = new string[SIZE1];
ten = new string[SIZE2];
initializeArray();
}
次に、上の人が言っていたことです。サイズ18の配列に19の値を代入しようとしているので、配列のサイズに間違った値が設定されています。念のため、サイズを予想より大きくしておいて、後で調整できるようにしておきましょう。
const int SIZE1 = 20;
const int SIZE2 = 20;
さらに、determine()を見てください。forループを使う代わりに、次のようにしてください。
string name = one[number];
EDIT: うわー、もうひとつ見逃してたことがありました。配列ポインタ変数を2回宣言しているので、ローカルバージョンを作りたいと考えて、実際にはスコープの外に出てしまっています。私が調整したコンストラクタの実装をもう一度見てみてください。変数名の前にある「String *」を削除しているのがわかると思います。
関連
-
[解決済み] テスト
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Enterキーを押して続行する
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 0xC0000005: アクセス違反(場所 0x00000000 の読み込み
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++