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

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

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

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В том то и дело, что как читать файл он знает
Знать может и знает, но динамический массив нулевого размера объявляет с настойчивостью, достойной лучшего применения.
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. тоже мусор там лежит.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
28.10.2012, 20:01     Ошибка : Попытка чтения или записи в защищенную память #13
Цитата Сообщение от kertio Посмотреть сообщение
но если после запуска программы я сразу же выберу пункт 3
Если ты его выберешь, тог программа просто скажет, что файла не существует, вне зависимости от его наличия.
Потому что переменная est тоже задается только в addvd.
Никакой ошибки.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 20:04     Ошибка : Попытка чтения или записи в защищенную память #14
Цитата Сообщение от kertio Посмотреть сообщение
но если после запуска программы я сразу же выберу пункт 3
Это он через значене est обходит, а вот с m - ошибка.
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
28.10.2012, 20:05  [ТС]     Ошибка : Попытка чтения или записи в защищенную память #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Значение t где задано?
Она объявлена как глобальная перед структурой

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Запустил прогу.
О! И самый главный вопрос. Зачем ты заставляешь меня каждый раз вводить новый массив дисков? Он же в файле сохраняется после первого запуска!!! est не должно быть всегда равно false
Я так сделал потому что не знаю как определить потом есть ли БД дисков и сколько в нем записано дисков.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 20:11     Ошибка : Попытка чтения или записи в защищенную память #16
Если m в циклах задать и dvd *p2 = new dvd[t], ошибки нет, но муссор выводит при "Удалить с ценой выше чем..."
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
28.10.2012, 20:14  [ТС]     Ошибка : Попытка чтения или записи в защищенную память #17
Цитата Сообщение от alsav22 Посмотреть сообщение
А значение m где?
79 строка - объявление
85 - присвоение 0
105 - прибавление на 1 диск

Цитата Сообщение от kertio Посмотреть сообщение
t задается только в addvd
А как присвоить его в addvd чтобы потом его другие функции тоже видели, как то через указатель?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 20:22     Ошибка : Попытка чтения или записи в защищенную память #18
Цитата Сообщение от иван_пропал Посмотреть сообщение
79 строка - объявление
Я разве про объявление спросил? Переменная m, объявленная в 79 строке, вообще, нигде не используется. В циклах вы объявляете уже другие переменные с тем же именем, а значения не задаёте (110, 121)
иван_пропал
36 / 0 / 1
Регистрация: 05.10.2012
Сообщений: 110
28.10.2012, 20:28  [ТС]     Ошибка : Попытка чтения или записи в защищенную память #19
Цитата Сообщение от alsav22 Посмотреть сообщение
а значение не задаёте.
а развет int m = 0 не задает значение 0 ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2012, 20:29     Ошибка : Попытка чтения или записи в защищенную память
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.10.2012, 20:29     Ошибка : Попытка чтения или записи в защищенную память #20
110, 121.
Yandex
Объявления
28.10.2012, 20:29     Ошибка : Попытка чтения или записи в защищенную память
Ответ Создать тему
Опции темы

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