access violation reading location c++
I'm writing a program that print the full english name of the number inputted by the user. it's not a complete program but i keep getting an error:
First-chance exception at 0x00b02c76 in Programming Challenge 14.1.exe: 0xC0000005: Access violation reading location 0xcccccd80. Unhandled exception at 0x00b02c76 in Programming Challenge 14.1.exe: 0xC0000005: Access violation reading location 0xcccccd80.
I've tried looking around and couldn't find anything of use to me. here this the program:
header file:
#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
and this is the main program, im just using a constructor to assign a value to number to make debugging a little faster
#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; }
by the way this is vc++ for the compiler
ill answer any questions as this isnt really too organized
14 Answers
const int SIZE1 = 18;
Valid array index for the array of SIZE1
are 0 to 17. In general, valid indexes for an array of size N are 0 to N-1.
I recommend using std::vector<std::string>
.
one
holds 18 elements, but you put 19 elements in there.
Two things here:
You are not calling "initializeArray()" at all. So when you are trying to access the array there is nothing there. I would recommend calling it in the constructor. Like this:
Numbers(int num) { number = num; hundred = "hundred"; thousand = "thousand"; one = new string[SIZE1]; ten = new string[SIZE2]; initializeArray(); }
Second, is what the guys above said. You have an incorrect value for the size of your array since you are trying to assign 19 values to an array of size 18. Just to be really sure lets make the size bigger than we expect and you can adjust later:
const int SIZE1 = 20; const int SIZE2 = 20;
Additionally, See your determine()? instead of using a for loop why don't you go:
string name = one[number];
EDIT: Wow there was another thing I missed...you have declared your array pointer variable twice and so it's actually going out of scope thinking you want to make some local versions. Look at my adjusted implementation of your constructor above again. See how I've removed the "String *" from before the variable names.
8The variable "one" and "ten" have been changed from string pointers to vectors holding strings. Called the initializeArray within the constructor. Changed the way the name string was being assigned the new string. Here is the working code.
class Numbers { private: int number; string hundred; string thousand; vector<string> one; vector<string> ten; public: Numbers(int num) { number = num; hundred = "hundred"; thousand = "thousand"; initializeArray(); } void initializeArray() { one.push_back("zero"); one.push_back("one"); one.push_back( "two"); one.push_back("three"); one.push_back("four"); one.push_back("five"); one.push_back("six"); one.push_back("seven"); one.push_back("eight"); one.push_back("nine"); one.push_back("eleven"); one.push_back("twelve"); one.push_back("thirteen"); one.push_back("fourteen"); one.push_back("fifteen"); one.push_back("sixteen"); one.push_back("seventeen"); one.push_back("eighteen"); one.push_back("nineteen"); // Initialize the ten array ten.push_back("ten"); ten.push_back("twenty"); ten.push_back("thirty"); ten.push_back("forty"); ten.push_back("fifty"); ten.push_back("sixty"); ten.push_back("seventy"); ten.push_back("eighty"); ten.push_back("ninety"); } string determine() { string name(""); for (int i = 0; i <= number; i++) { if (number == i) { auto iter = one.begin(); iter += i; name.assign(*iter); } } return name; } ~Numbers() { } }; int main() { Numbers n(5); string name = n.determine(); cout << "The number is " << name << endl; cin.ignore(); cin.get(); return 0; }
2ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoaHFuZG2BdXyOmpqcnaOoere1zqWYraGfo3qzscCdoKefXaG8pK3ToqanZZM%3D