Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 445
#1

Исключение Нарушение прав доступа при чтении - C++

23.04.2014, 11:52. Просмотров 355. Ответов 3
Метки нет (Все метки)

Есть такое задание - создать 2 класса
Класс -символ, c печататью свое знач и ответом на запрос о значении своего символьного поля;
класс строка- массив из 15 симв, умеющий выводить на печать зн своих элементов
вот
реализация
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string.h>
using namespace std;
class TSymb 
{//символ,c печатать свое зн и отв на запрос о знач св символьного поля; 
public:
TSymb(char c); 
void printCH();
protected:
  char ch;
};
TSymb::TSymb(char c)
{ ch=c;}
void TSymb::printCH()
{cout<<ch;}
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
   char *Ref;
  TSymb *smb[3]; 
  public:
     TString(char *ref);
     ~TString(void) {  delete Ref;}
      void prn();
};
 
TString::TString(char *ref)
{  char c;
    for (int i=0;i<3;i++){
     c=ref[i];
     smb[i]=new TSymb(c);
    }
}
void TString::prn()
{ 
    for(int i=0;i<3;i++)
        smb[i]->printCH();
}
и тест-функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{ 
  char c; char s[15];
  while(1==1) {
  cout <<"\n0-Vixod\n"; cin>>c;
  if (c=='0') break;
  cout<<"vvesti text <=50\n";
  cin>>s; //cin.getline(s, 50);
  TString str(s);
  str.prn();
             }
}
Проблема в том что выдает видимо после печати исключение
Нарушение прав доступа при чтении "0xccccccc0"
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2014, 11:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исключение Нарушение прав доступа при чтении (C++):

Необработанное исключение. Нарушение прав доступа при чтении - C++
Ребят помогите. В общем есть программа, открывает один файл, ищет в нем последовательности, заменяет на другие. В консоли все прекрасно...

Необработанное исключение по адресу 0x008B94C5. 0xC0000005: нарушение прав доступа при чтении по - C++
Здравствуйте! Функция должна искать локальные минимумы массива. То есть это элементы,которые меньше своих соседей. Дело в том,что функция...

Необработанное исключение: "Нарушение прав доступа при чтении" - C++
При выполнении тестов {input...output} появляется необработанное исключение по адресу 0x009577E1 в 1590.exe: 0xC0000005: нарушение прав...

Вызвано исключение по адресу 0x013C1891 в Jacobi.exe: 0xC0000005: нарушение прав доступа при чтении по адресу - C++
#include &lt;math.h&gt; const double eps = 0.001; ///&lt; желаемая точность /// N - размерность матрицы; A - матрица коэффициентов, F -...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC - C++
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже число, но если убрать srand(time(0));,...

Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09 - C++
Необработанное исключение по адресу 0x00105FD7 в Динамические структуры.exe: 0xC0000005: нарушение прав доступа при чтении по адресу...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Worf
43 / 43 / 6
Регистрация: 06.02.2014
Сообщений: 233
23.04.2014, 11:56 #2
Прогони выполнение проги в отладочном режиме и посмотри, когда у тебя вылетает и поймёшь, от чего
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
23.04.2014, 12:03 #3
Цитата Сообщение от eugrita Посмотреть сообщение
TSymb *smb[3];
Ну и какую роль здесь выполняют указатели? Я скажу какую: портят память и больше ничего полезного! Потому что массив сам по себе статический!
А память портится из-за отсутствия конструктора копирования,
отсутствия оператора "="
отсутствия деструктора.

Поэтому, либо добаваляй всё перечисленное, либо используй TSymb smb[3];
0
eugrita
3 / 4 / 0
Регистрация: 18.11.2009
Сообщений: 445
23.04.2014, 13:06  [ТС] #4
Не понял про отсутствие оператора "="
TSymb *smb[3] означала у меня агрегацию по ссылке (символы могут существовать и при уничтожении слова)
вариант TSymb smb[3]; означает агрегацию по значению - композицию. Не важно как это обзывать- лишь для понимания. Если прямо так TSymb smb[3]; то говорит -нет подходящего конструктора
вот сделал такой вариант с вектором (композиция)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
   char *Ref;
  vector <TSymb> smb; 
  public:
     TString(char *ref);
     ~TString(void) {  delete Ref;}
      void prn();
};
 
TString::TString(char *ref)
{  char c;
    for (int i=0;i<3;i++){
     c=ref[i];
     smb.push_back(TSymb(c));
    }
}
void TString::prn()
{ 
    for(int i=0;i<3;i++)
        smb[i].printCH();
}
теперь хоть печатает, но в конце опять то же исключение по доступу.
Надо видно еще деструкторы делать.

Добавлено через 54 секунды
Не понял про отсутствие оператора "="
TSymb *smb[3] означала у меня агрегацию по ссылке (символы могут существовать и при уничтожении слова)
вариант TSymb smb[3]; означает агрегацию по значению - композицию. Не важно как это обзывать- лишь для понимания. Если прямо так TSymb smb[3]; то говорит -нет подходящего конструктора
вот сделал такой вариант с вектором (композиция)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class TString//объект «строка»- массив из 15 симв, умеющий выводить на печать зн своих элем 
{ private:   
   char *Ref;
  vector <TSymb> smb; 
  public:
     TString(char *ref);
     ~TString(void) {  delete Ref;}
      void prn();
};
 
TString::TString(char *ref)
{  char c;
    for (int i=0;i<3;i++){
     c=ref[i];
     smb.push_back(TSymb(c));
    }
}
void TString::prn()
{ 
    for(int i=0;i<3;i++)
        smb[i].printCH();
}
теперь хоть печатает, но в конце опять то же исключение по доступу.
Надо видно еще деструкторы делать.

Добавлено через 27 минут
Ну все добавил деструктор
C++
1
2
TString::~TString() 
{  smb.clear();}
и перестало валиться
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2014, 13:06
Привет! Вот еще темы с ответами:

Необработанное исключение в "0x0138169d" в "kursovaya.exe": 0xC0000005: Нарушение прав доступа при чтении "0x6 - C++
Программа выдает ошибку, может кто видит где? и как исправить Код: #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cmath&gt; using...

Нарушение прав доступа при чтении - C++
Здравствуйте! На строке catalog-&gt;push_back(*record); Выдает ошибку: Первый этап обработки исключения в &quot;0x00173589&quot; в &quot;Traning2.exe&quot;:...

Нарушение прав доступа при чтении - C++
Имею функцию такого плана: void RenameOldLabels() { USES_CONVERSION; string path, pathAfterRename, pathToDelFile, pathToDelDir,...

Нарушение прав доступа при чтении - C++
// ConsoleApplication6.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &quot;stdafx.h&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.04.2014, 13:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru