2013-09-06 6 views
1

Я пишу программу, которая печатает полное английское имя числа, введенного пользователем. это не полная программа, но я продолжаю получать сообщение об ошибке:нарушение доступа к чтению C++

Исключение при первом запуске в 0x00b02c76 в программировании Challenge 14.1.exe: 0xC0000005: Место для обнаружения нарушения доступа 0xcccccd80. Необработанное исключение в 0x00b02c76 в программировании Challenge 14.1.exe: 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++ для компилятора

плохо ответить на любые вопросы, так как это действительно не организовано

+0

Почему бы не использовать вектор строк? –

ответ

1

Две вещи здесь:

Вы не зовем "initializeArray()" вообще. Поэтому, когда вы пытаетесь получить доступ к массиву, там ничего нет. Я бы рекомендовал вызвать его в конструкторе. Например:

Numbers(int num) 
{ 
    number = num; 
    hundred = "hundred"; 
    thousand = "thousand"; 
    one = new string[SIZE1]; 
    ten = new string[SIZE2]; 
    initializeArray(); 
} 

Во-вторых, это то, что говорили выше. У вас неправильное значение для размера вашего массива, поскольку вы пытаетесь присвоить 19 значений массиву размера 18. Просто чтобы быть уверенным, давайте сделаем размер больше, чем мы ожидаем, и вы можете отрегулировать его позже:

const int SIZE1 = 20; 
const int SIZE2 = 20; 

Кроме того, см. Определение()? вместо того, чтобы использовать для цикла, почему бы вам не пойти:

string name = one[number]; 

EDIT: Wow была еще одна вещь, которую я пропустил ... вы объявили переменную указатель массива в два раза, и поэтому он на самом деле выходит за рамки мышления вас хотите сделать некоторые локальные версии. Посмотрите на мою скорректированную реализацию вашего конструктора выше. Посмотрите, как я удалил строку «String *» перед именами переменных.

+0

Я сделал ваши предложения, и он все еще продолжает бросать на меня ошибку, хотел бы увидеть отредактированный код? может, я что-то пропустил? – user2752676

+0

hmmm позвольте мне просто изменить мой ответ, чтобы убедиться, что мы оба на одной странице. – user1567453

+0

Хорошо, так сделал то, что вы сказали мне в конструкторе, как и для задания, которое не включало бы утверждение if/else? Я продолжаю получать ошибку, вы думаете, что это может быть деструктор, который неправильно выполняет? – user2752676

2

one содержит 18 элементов, но вы поставили там 19 элементов.

+0

Не могу поверить, что я пропустил это. Большое вам спасибо, двое из вас плохо видят, работает ли это – user2752676

2
const int SIZE1 = 18; 

Действительный индекс массива для массива SIZE1 от 0 до 17. В целом, действительных индексы для массива размера N является в N-1.

Я рекомендую использовать std::vector<std::string>.

0

Переменные «один» и «десять» были изменены с указателей строк на векторы, содержащие строки. Вызывается initializeArray внутри конструктора. Изменен способ присвоения строки имени новой строке. Вот рабочий код.

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; 
} 
+0

oh wow im не слишком знакомы с векторами, я знаю только их основные функции и цели, но им не знаком с – user2752676

+0

auto iter = one.begin(); iter + = i; name.assign (* iter); – user2752676

Смежные вопросы