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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.94
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
#1

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

28.10.2012, 18:12. Просмотров 5167. Ответов 27
Метки нет (Все метки)

выходит ошибка после того как выполняется функция 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2012, 18:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка : Попытка чтения или записи в защищенную память (C++):

Попытка чтения или записи в защищенную память - C++
Здравствуйте. Вот такая проблема. При компиляции программы выводит сообщение: An unhandled exception of type...

Попытка чтения или записи в защищенную память - C++
собственно в проблема в заголовке #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; void...

Попытка чтения или записи в защищенную память - C++
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. P.S. не ругайтесь...

Ошибка: "Попытка чтения или записи в защищенную память" - C++
Вот это выдает: Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память...

Динамический массив структур - ошибка "попытка чтения или записи в защищенную память" - C++
не работает: class Students { struct list { string marka_mashini; string familiya_vladelca; int god_vipuska; ...

Двумерный динамический массив. Попытка чтения или записи в защищенную память - C++
В общем функция выглядит так float** calculate(float H, float W, float L, float Vu, float Tu, float l, float ro, float T0, float C,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.10.2012, 18:50 #2
C++
1
dvd *p2 = new dvd[];// сюда сохр отсортированные диски
А что? размер тут не указан?
0
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
28.10.2012, 18:58  [ТС] #3
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А что? размер тут не указан?
Если укажу то все равно такая ошибка пишет.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.10.2012, 19:11 #4
так почему б не указать и продолжить искать ошибку?
0
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
28.10.2012, 19:17  [ТС] #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
так почему б не указать и продолжить искать ошибку?
так ошибка точна такая же появляется
скриншот http://s1.ipicture.ru/uploads/20121028/CmT5BlLu.png
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.10.2012, 19:25 #6
и почему у тебя каждый раз выделяется дин.массив, читается из файла, и удаляется? Думаю ошибка связана с тем, что ты и сам запутался в этих new/delete и где-то удалил невыделенную/освобождённую память.

Добавлено через 6 минут
короче, начни с простого. Прочитай из файла в массив эти данные. Поставь точку останова и проверь, правильно ли считался массив.
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 19:29 #7
Значение t где задано?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.10.2012, 19:35 #8
Запустил прогу.
О! И самый главный вопрос. Зачем ты заставляешь меня каждый раз вводить новый массив дисков? Он же в файле сохраняется после первого запуска!!! est не должно быть всегда равно false
Значение t где задано?
Проблема из той же серии. Оно вводится пользователем при создании новой базы дисков. Вообще невозможно прочитать эту базу из файла. Только заставить юзера ввести новые кол-во дисков, их содержание, и только потом работать. А файл тут вообще просто рядом стоит и постоянно загружается/выгружается.
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 19:44 #9
Чтение структуры из файла
Структура выводит мусор

Увидел.
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.10.2012, 19:48 #10
Цитата Сообщение от alsav22 Посмотреть сообщение
чтение структуры из файла
Структура выводит мусор
В том то и дело, что как читать файл он знает и при этом производит следующее.
ТРЕБУЕТ ввести массив с клавы вне зависимости от наличия файла.
Сохраняет его в файле, удаляет массив из памяти
При вызове функции удаления элемента
снова выделяет память под массив,
читает файл
выделяет память под второй массив,
копирует в него искомые данные
копирует данные из массива в файл
удаляет массив из памяти.
1
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 19:55 #11
C++
1
for(int m ; m < e; m++)
А значение m где?

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В том то и дело, что как читать файл он знает
Знать может и знает, но динамический массив нулевого размера объявляет с настойчивостью, достойной лучшего применения.
0
kertio
26 / 26 / 1
Регистрация: 20.09.2011
Сообщений: 68
28.10.2012, 19:57 #12
alsav22 правильно спросил, где задан t?
t задается только в addvd. то есть если я всю программу пройду по меню от первого до последнего то может и отработает нормально, но если после запуска программы я сразу же выберу пункт 3, то в t будет в лучшем случае 0. или мусор, что скорее всего. от сюда и ошибка. добавь в poisk_cena проверку на корректность t. ну и выведи её перед циклом. увидишь какая ерунда там хранится. то же самое и m. тоже мусор там лежит.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
28.10.2012, 20:01 #13
Цитата Сообщение от kertio Посмотреть сообщение
но если после запуска программы я сразу же выберу пункт 3
Если ты его выберешь, тог программа просто скажет, что файла не существует, вне зависимости от его наличия.
Потому что переменная est тоже задается только в addvd.
Никакой ошибки.
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 20:04 #14
Цитата Сообщение от kertio Посмотреть сообщение
но если после запуска программы я сразу же выберу пункт 3
Это он через значене est обходит, а вот с m - ошибка.
1
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
28.10.2012, 20:05  [ТС] #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Значение t где задано?
Она объявлена как глобальная перед структурой

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Запустил прогу.
О! И самый главный вопрос. Зачем ты заставляешь меня каждый раз вводить новый массив дисков? Он же в файле сохраняется после первого запуска!!! est не должно быть всегда равно false
Я так сделал потому что не знаю как определить потом есть ли БД дисков и сколько в нем записано дисков.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2012, 20:05
Привет! Вот еще темы с ответами:

Структура / Попытка записи в защищенную память - C++
Доброго времени суток. Смотрите, есть следующий код: struct NewsInfo { int ID; char text; int typepost = -1; }; ...

Ошибка "Попытка чтения в запрещенную память" при работе с файлами - C++
Нужно хранить в файле данные со структуры и считывать их. Перепробовал кучу вариантов (fopen и ofstream/ifstream), постоянно одна и та же...

Ошибка записи и чтения объектов - C++
Всем привет. Говорю сразу: Кто сделает этот код рабочим, заплачу 300 р. на PayPal аккаунт (если таковой имеется) Делаю задание...

Как поток чтения (или записи) запихнуть в класс? - C++
Здравствуйте!!! Ребят, подскажите пожалуйста, собственно, как запихнуть в класс поток ifstream? Че-то я озадачен оказался *-) Без...


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

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

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