1. ホーム
  2. c++

[解決済み] アクセス違反の読み取り場所 c++

2022-01-30 20:15:49

質問

入力された数字の英語名を表示するプログラムを書いているのですが、完全なプログラムではないのに、ずっとエラーが出てしまいます。

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 *」を削除しているのがわかると思います。