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

Ошибка : Попытка чтения или записи в защищенную память - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.94
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
28.10.2012, 18:12     Ошибка : Попытка чтения или записи в защищенную память #1
выходит ошибка после того как выполняется функция void poisk_cena(). Подскажите пожалуйста где ошибка.
Ошибка:
Необработанное исключение типа "System.AccessViolationException" произошло в kurs_9.exe
Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
код:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// kurs_9_2.cpp: главный файл проекта.
 
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <atlstr.h>
#include <string>
 
#include <stdio.h>
#include <stdlib.h>
 
 
using namespace System;
using namespace std;
 
//**********
 
int t; // кол dvd дисков
bool est=false; // имеется ли БД дисков 
 
struct dvd //структура dvd диска 
{
string namefilm;//название фильма
string namereg;// имя режисера
int prodol; // продолжительность в минутах
int cena; // цена
};
 
 
void addvd() // добавление дисков
{   
 
    cout<<"Вводите только латиницей(английскими)\n";
    cout<<"Количество dvd дисков = "; 
    cin>>t;
dvd *p1 = new dvd[t];
 //запись в файл
 fstream f("f.dat", ios::out);
    for(int i=0; i<t; i++)
 {  cout<<"\nназвание фильма: ";           cin>>p1[i].namefilm;   f<<p1[i].namefilm<<" ";
    cout<<"имя режисера: ";                cin>>p1[i].namereg;    f<<p1[i].namereg<<" ";
    cout<<"продолжительность в минутах: "; cin>>p1[i].prodol;     f<<p1[i].prodol<<" ";
    cout<<"цена: ";                        cin>>p1[i].cena;       f<<p1[i].cena<<"\n";
  }
 f.close();//закрытие потока
 delete [] p1;
 est=true;
}
 
 
void print()//вывести на экран
{ if (est){ 
dvd *p1 = new dvd[t];
cout<<"\n";
fstream f("f.dat", ios::in);
for(int i = 0; i<t; i++)
{  
    cout<<"    Диск: "<<i+1<<endl;
    f >> p1[i].namefilm; cout<<"Название фильма: "<<p1[i].namefilm<<endl;
    f >> p1[i].namereg; cout<<"Имя режисера: "<<p1[i].namereg<<endl;
    f >> p1[i].prodol; cout<<"Продолжительность: "<<p1[i].prodol<<endl;
    f >> p1[i].cena; cout<<"Цена: "<<p1[i].cena<<"\n\n";
    
}
f.close();
delete [] p1;}
else {cout<<"\nОшибка! Нет дисков\n";}
}
 
//*********
void poisk_cena(){
if (est){ 
dvd *p1 = new dvd[t];
int rub;
cout<<"Задайте цену: ";
cin>>rub;
//*******
int m; 
dvd *p2 = new dvd[];// сюда сохр отсортированные диски
int e = 0; // количество оставшихся дисков
//*********
 
fstream f("f.dat", ios::in);
for(int i = 0 , m = 0 ; i<t; i++) // тут выводит ошибку после первой итерации 
{  
    f >> p1[i].namefilm; 
    f >> p1[i].namereg;
    f >> p1[i].prodol;
    f >> p1[i].cena;
    if (p1[i].cena<rub){
        cout<<"       Диск: "<<i+1<<"\n";
 
        cout<<"Название фильма: "<<p1[i].namefilm<<"\n";    
        cout<<"Имя режиссера: "<<p1[i].namereg<<"\n";       
        cout<<"Продолжительность: "<<p1[i].prodol<<"\n";    
        cout<<"Цена: "<<p1[i].cena<<"\n\n";                 
        // присвоение
        p2[m].namefilm = p1[i].namefilm;
        p2[m].namereg  = p1[i].namereg;
        p2[m].prodol   = p1[i].prodol;
        p2[m].cena     = p1[i].cena;
    
    //memcpy( &p2[m], &p1[i], sizeof(struct dvd)); // присвоение всей структуры
    m++;
    e++;
    }
}
 
for(int m ; m<e; m++)
{   cout<<"-------------------------\n";
    cout<<"Название фильма: "<<p2[m].namefilm<<endl;
    cout<<"Имя режисера: "<<p2[m].namereg<<endl;
    cout<<"Продолжительность: "<<p2[m].prodol<<endl;
    cout<<"Цена: "<<p2[m].cena<<"\n\n";
}
 
f.close(); 
// запись результата в файл
fstream fs("f.dat", ios::out);
for(int m ; m<e; m++)
{
fs << p2[m].namefilm << " ";
fs << p2[m].namereg << " ";
fs << p2[m].prodol << " ";
fs << p2[m].cena << "\n";
}
fs.close(); delete [] p2; delete [] p1; 
}
else {cout<<"\nОшибка! Нет дисков\n";}
 
}
//*******  ГЛАВНАЯ ***************
int main()
{
    setlocale(LC_ALL,"Russian"); // подключение русского языка
    int k; // меню
     
    do{
    cout<<"1. Создать БД дисков\n";
    cout<<"2. Вывести данные\n";
    cout<<"3. Удалить с ценой выше чем...\n";
    cout<<"4. Выход\n";
    cin>>k;
    switch(k){
    case 1: addvd(); break;
    case 2: print(); break;
    case 3: poisk_cena(); break;
    }} while(k!=4);
 
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kertio
26 / 26 / 1
Регистрация: 20.09.2011
Сообщений: 68
28.10.2012, 20:31     Ошибка : Попытка чтения или записи в защищенную память #21
Цитата Сообщение от иван_пропал Посмотреть сообщение
79 строка - объявление
85 - присвоение 0
105 - прибавление на 1 диск


А как присвоить его в addvd чтобы потом его другие функции тоже видели, как то через указатель?

В любом участке кода в любой функции. у переменной t глобальная область видимости. указатели тут не нужны.
Запомни раз на всю жизнь: "Перед использованием любой переменной, проверь её на то что она корректно инициализирована"

И научись отличать "объявление" от "инициализации".
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 20:39     Ошибка : Попытка чтения или записи в защищенную память #22
Цитата Сообщение от иван_пропал Посмотреть сообщение
79 строка - объявление
Объявление m. Нигде переменная не используется.

Цитата Сообщение от иван_пропал Посмотреть сообщение
85 - присвоение 0
Объявление другой переменной m и присвоение значения 0.
110 строка. Объявление другой переменной m без присвоения значения .
121 строка. Объявление другой переменной m без присвоения значения .
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
28.10.2012, 20:59  [ТС]     Ошибка : Попытка чтения или записи в защищенную память #23
А как правильно тогда объявлять, инициализировать и присваивать чтоб работало?
Пробовал так
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
for(int i = 0 , m = 0 ; i<t; i++)
{  
    f >> p1[i].namefilm; 
    f >> p1[i].namereg;
    f >> p1[i].prodol;
    f >> p1[i].cena;
         if (p1[i].cena<rub){// присваиваем новому массиву
            cout<<"       Диск: "<<i+1<<"\n";
 
            cout<<"Название фильма: "<<p1[i].namefilm<<"\n";    
            cout<<"Имя режиссера: "<<p1[i].namereg<<"\n";       
            cout<<"Продолжительность: "<<p1[i].prodol<<"\n";    
            cout<<"Цена: "<<p1[i].cena<<"\n\n";                 
            // присвоение
            
            p2[m].namefilm = p1[i].namefilm;
            p2[m].namereg  = p1[i].namereg;
            p2[m].prodol   = p1[i].prodol;
            p2[m].cena     = p1[i].cena;
        
            m++;
            e=m; 
            }
    }
kertio
26 / 26 / 1
Регистрация: 20.09.2011
Сообщений: 68
28.10.2012, 21:16     Ошибка : Попытка чтения или записи в защищенную память #24
Цитата Сообщение от иван_пропал Посмотреть сообщение
А как правильно тогда объявлять, инициализировать и присваивать чтоб работало?
Пробовал так
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
for(int i = 0 , m = 0 ; i<t; i++)
{  
    f >> p1[i].namefilm; 
    f >> p1[i].namereg;
    f >> p1[i].prodol;
    f >> p1[i].cena;
         if (p1[i].cena<rub){// присваиваем новому массиву
            cout<<"       Диск: "<<i+1<<"\n";
 
            cout<<"Название фильма: "<<p1[i].namefilm<<"\n";    
            cout<<"Имя режиссера: "<<p1[i].namereg<<"\n";       
            cout<<"Продолжительность: "<<p1[i].prodol<<"\n";    
            cout<<"Цена: "<<p1[i].cena<<"\n\n";                 
            // присвоение
            
            p2[m].namefilm = p1[i].namefilm;
            p2[m].namereg  = p1[i].namereg;
            p2[m].prodol   = p1[i].prodol;
            p2[m].cena     = p1[i].cena;
        
            m++;
            e=m; 
            }
    }
C++
1
for(int i = 0 , m = 0 ; i<t; i++)
тут на каждой итерации m снова становится 0. тут присваивание.
попробуй так
C++
1
2
int m = 0;
for(int i = 0; i<t; i++)
далее в теле цикла она инкрементируется где нужно.

Добавлено через 3 минуты
или
C++
1
for(int i = 0 , int m = 0 ; i<t; i++)
отличается тем, что в теле for конструируется новый объект типа int значением 0. а в исходном варианте идет присваивание, так как объект m уже существует. создавать его значит не нужно. как-то так.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
28.10.2012, 22:17     Ошибка : Попытка чтения или записи в защищенную память #25
Цитата Сообщение от kertio Посмотреть сообщение
тут на каждой итерации m снова становится 0. тут присваивание.
ты уверен?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.10.2012, 02:06     Ошибка : Попытка чтения или записи в защищенную память #26
Код
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
 
struct dvd // структура dvd диска 
{
    string namefilm; // название фильма
    string namereg; // имя режисера
    int prodol; // продолжительность в минутах
    int cena; // цена
};
 
void addvd() // создание базы и добавление дисков
{   
    cout << "Вводите только латиницей(английскими)\n";
    cout << "Количество dvd дисков = ";
    int t; // количество добавляемых дисков
    (cin >> t).get();
 
    dvd *p = new dvd[t];
    int n = 0; // количество дисков в файле (записывается в первой строке)
  
  //запись в файл
 
 fstream f("f.txt");
 if (!f.is_open()) // если файла не существует
 {
    f.open("f.txt", ios::out);
    f << t << '\n'; // записываем в файл количество дисков
    f.close();
 }
 else // если файл существует
 {
    f >> n; // читаем количество дисков в файле
    f.seekg(0);
    f << t + n << '\n'; // записываем новое количество дисков в файле
    f.close();
 }
 
 f.open("f.txt", ios::app); // открываем файл для дозаписи
 
 for(int i = 0; i < t; i++)
 {  cout << "\nНазвание фильма: ";           getline(cin, p[i].namefilm);  f << p[i].namefilm << '\n';
    cout << "Имя режисера: ";                getline(cin, p[i].namereg);   f << p[i].namereg  << '\n';
    cout << "Продолжительность в минутах: ";  cin  >> p[i].prodol;          f << p[i].prodol   << '\n';
    cout << "Цена: ";                        (cin >> p[i].cena).get();     f << p[i].cena     << '\n';
 }
 f.close(); 
 
 delete [] p;
}
 
 
void print() // вывести из файла на экран
{ 
  fstream f("f.txt");
  if (!f.is_open()) cout << "\nБазы дисков не существует." << endl << endl;
  else
  {
      int n = 0;
      (f >> n).get();
      if (n == 0) cout << "\nДисков в базе нет." << endl << endl;
      else
      {
          for(int i = 0; i < n; i++)
          {  
                string temp;
                int v;
                
                cout << "    Диск: "<< i + 1 << endl;
                cout << "\nНазвание фильма: ";           getline(f, temp);   cout << temp << endl;
                cout << "Имя режисера: ";                getline(f, temp);   cout << temp << endl;
                cout << "Продолжительность в минутах: "; f  >> v;            cout << v    << endl;
                cout << "Цена: ";                        (f >> v).get();     cout << v    << endl;
                cout << endl;
          }
          f.close();
      }
   }
}
 
void poisk_cena()
{
  fstream f("f.txt");
  if (!f.is_open()) cout << "\nБазы дисков не существует." << endl << endl;
  else
  {
      int n = 0;
      (f >> n).get();
      if (n == 0) cout << "\nДисков в базе нет." << endl << endl;
      else
      {
          int rub;
          cout << "Задайте цену: ";
          (cin >> rub).get();
 
          int e = 0; // количество дисков в новой базе
          
          dvd *p = new dvd[n]; // массив для новой базы
  
          for(int i = 0 ; i < n; i++) // чтение из файла во временную структуру
          { 
                dvd temp; 
                getline(f, temp.namefilm); 
                getline(f, temp.namereg);
                f >> temp.prodol;
                (f >> temp.cena).get();
                if (temp.cena < rub) // если цена ниже, то помещаем сруктуру в массив
                {
                    p[i] = temp;
                    e++;
                }
          }
          f.close();      
 
        //вывод на экран и запись в файл новой базы
         f.open("f.txt", ios::out);
         f << e << '\n';
         if (e == 0) cout << "\nДисков в базе нет." << endl << endl;
         for(int i = 0; i < e; i++)
         {  
            cout << "\n    Диск: "                   << i + 1 << endl;
            cout << "\nНазвание фильма: "           << p[i].namefilm << '\n';  f << p[i].namefilm <<'\n';
            cout << "Имя режисера: "                << p[i].namereg  << '\n';  f << p[i].namereg  << '\n';
            cout << "Продолжительность в минутах: " << p[i].prodol   << '\n';  f << p[i].prodol   << '\n';
            cout << "Цена: "                        << p[i].cena     << '\n';  f << p[i].cena     << '\n';
            cout << endl;
         }
         f.close(); 
 
         delete [] p;
     }
  }
}
 
 
int main()
{
    setlocale(LC_ALL,"Russian"); // подключение русского языка
    
    int k; // меню
    do
    {
        cout << endl;
        cout << "1. Создать БД дисков или добавить в базу\n";
        cout << "2. Вывести данные\n";
        cout << "3. Удалить с ценой выше чем...\n";
        cout << "4. Выход\n";
        
        (cin >> k).get();
        switch(k)
        {
            case 1: addvd(); 
                break;
            case 2: print(); 
                break;
            case 3: poisk_cena(); 
                break;
        }
    } while(k != 4 );
 
    system("pause");
    return 0;
}
kertio
26 / 26 / 1
Регистрация: 20.09.2011
Сообщений: 68
29.10.2012, 07:03     Ошибка : Попытка чтения или записи в защищенную память #27
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты уверен?
нда, сам же ответил, что m увеличивается где нужно, и сам же фигню спорол. прошу прощения, был уставший, внимание не то
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2012, 06:22     Ошибка : Попытка чтения или записи в защищенную память
Еще ссылки по теме:

C++ Попытка чтения или записи в защищенную память
C++ Ошибка "Попытка чтения в запрещенную память" при работе с файлами
Двумерный динамический массив. Попытка чтения или записи в защищенную память C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.11.2012, 06:22     Ошибка : Попытка чтения или записи в защищенную память #28
Небольшое исправление:
Кликните здесь для просмотра всего текста
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
 
struct dvd // структура dvd диска 
{
    string namefilm; // название фильма
    string namereg; // имя режисера
    int prodol; // продолжительность в минутах
    int cena; // цена
};
 
void addvd() // создание базы и добавление дисков
{   
    cout << "\n\nКоличество dvd дисков = ";
    int t; // количество добавляемых дисков
    (cin >> t).get();
 
    int n = 0; // количество дисков в файле (записывается в первой строке)
  
  //запись в файл
 
 fstream f("f.txt");
 if (!f.is_open()) // если файла не существует
 {
    f.open("f.txt", ios::out);
    f << t << '\n'; // записываем в файл количество дисков
    f.close();
 }
 else // если файл существует
 {
    f >> n; // читаем количество дисков в файле
    f.seekg(0);
    f << t + n << '\n'; // записываем новое количество дисков в файле
    f.close();
 }
 
 f.open("f.txt", ios::app); // открываем файл для дозаписи
 
 cout << "\nВводите только латиницей(английскими)\n";
 for(int i = 0; i < t; i++)
 {  
    dvd temp;
 
    cout << "\nНазвание фильма: ";           getline(cin, temp.namefilm);  f << temp.namefilm << '\n';
    cout << "Имя режисера: ";                getline(cin, temp.namereg);   f << temp.namereg  << '\n';
    cout << "Продолжительность в минутах: "; cin  >> temp.prodol;          f << temp.prodol   << '\n';
    cout << "Цена: ";                        (cin >> temp.cena).get();     f << temp.cena     << '\n';
 }
 
 f.close(); 
 
}
 
 
void print() // вывести из файла на экран
{ 
  fstream f("f.txt");
  if (!f.is_open()) cout << "\nБазы дисков не существует." << endl << endl;
  else
  {
      int n = 0;
      (f >> n).get();
      if (n == 0) cout << "\nДисков в базе нет." << endl << endl;
      else
      {
          for(int i = 0; i < n; i++)
          {  
                string temp;
                int v;
                
                cout << "    Диск: "<< i + 1 << endl;
                cout << "\nНазвание фильма: ";           getline(f, temp);   cout << temp << endl;
                cout << "Имя режисера: ";                getline(f, temp);   cout << temp << endl;
                cout << "Продолжительность в минутах: "; f  >> v;            cout << v    << endl;
                cout << "Цена: ";                        (f >> v).get();     cout << v    << endl;
                cout << endl;
          }
          f.close();
      }
   }
}
 
void poisk_cena()
{
  fstream f("f.txt");
  if (!f.is_open()) cout << "\nБазы дисков не существует." << endl << endl;
  else
  {
      int n = 0;
      (f >> n).get();
      if (n == 0) cout << "\nДисков в базе нет." << endl << endl;
      else
      {
          int rub;
          cout << "Задайте цену: ";
          (cin >> rub).get();
 
          int e = 0; // количество дисков в новой базе
          
          dvd *p = new dvd[n]; // массив для новой базы
  
          for(int i = 0 ; i < n; i++) // чтение из файла во временную структуру
          { 
                dvd temp; 
                getline(f, temp.namefilm); 
                getline(f, temp.namereg);
                f >> temp.prodol;
                (f >> temp.cena).get();
                if (temp.cena < rub) // если цена ниже, то помещаем сруктуру в массив
                {
                    p[e] = temp;
                    e++;
                }
          }
          f.close();      
 
        //вывод на экран и запись в файл новой базы
         f.open("f.txt", ios::out);
         f << e << '\n';
         if (e == 0) cout << "\nДисков в базе нет." << endl << endl;
         for(int i = 0; i < e; i++)
         {  
            cout << "\n    Диск: "                   << i + 1 << endl;
            cout << "\nНазвание фильма: "           << p[i].namefilm << '\n';  f << p[i].namefilm <<'\n';
            cout << "Имя режисера: "                << p[i].namereg  << '\n';  f << p[i].namereg  << '\n';
            cout << "Продолжительность в минутах: " << p[i].prodol   << '\n';  f << p[i].prodol   << '\n';
            cout << "Цена: "                        << p[i].cena     << '\n';  f << p[i].cena     << '\n';
            cout << endl;
         }
         f.close(); 
 
         delete [] p;
     }
  }
}
 
 
int main()
{
    setlocale(LC_ALL,"Russian"); // подключение русского языка
    
    int k; // меню
    do
    {
        cout << endl;
        cout << "1. Создать БД дисков или добавить в базу\n";
        cout << "2. Вывести данные\n";
        cout << "3. Удалить с ценой выше чем...\n";
        cout << "4. Выход\n";
        
        (cin >> k).get();
        switch(k)
        {
            case 1: addvd(); 
                break;
            case 2: print(); 
                break;
            case 3: poisk_cena(); 
                break;
        }
    } while(k != 4 );
 
    system("pause");
    return 0;
}
Yandex
Объявления
07.11.2012, 06:22     Ошибка : Попытка чтения или записи в защищенную память
Ответ Создать тему
Опции темы

Текущее время: 17:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru