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

Память не может быть прочитана! - C++

Восстановить пароль Регистрация
 
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
25.08.2011, 01:34     Память не может быть прочитана! #1
Проблема возникает при копировании одного массива в другой. Я вроди просмотрел и размерности вроди совпадают, но может быть я что то упустил, какую нибудь мелочь и поэтому возникает ошибка. Прошу помочь выяснить в чем конкретно проблема.

Входные параметры функции: n=7, m=2, matr[][2]={{1,2},{0,3},{3,4},{2,6},{5,-1},{-1,-1},{5,-1}}, a={0,1,2,3,4,5,6}, Array={{-1,-1,-1,-1,-1,-1,-1},{0,1,2,3,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},{5,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},{4,6,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},}, fora=1, forArray=9.

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
void part2(int n, int m, int matr[][2], int** a, int** Array, int& fora, int forArray)
{
int d2,d1,p1,p2,y1,y2,q1,q2;
 
for (int i=0; i<fora; i++) delete [] a[i];  //удаляем
delete [] a;                                //массив А
fora=forArray;                //новая расзмерность массива А ровна старой размерности массива Array
a = new int * [fora];                     //создаем
for (int i=0; i<fora; i++) a[i]=new int [n]; //новый массив А
 
for(int i=0; i<forArray; i++)   //копируем
{                               //элементы массива Array в
   for(int j=0; j<n; j++)       //массиву А
   {
   a[i][j]=Array[i][j];
   }
}
for (int i=0; i<forArray; i++) delete [] Array[i];  //удаляем
delete [] Array;                                    //массив Аrray
 //------------------------------
for(int i=0; i<n; i++)
{
   for(int j=0; j<m; j++)
   {
      if(j==0)
      {
         d1=matr[i][j];
      }
      else
      {
         d2=matr[i][j];
      }
   }
   p1=serchposition(d1,a,fora,n);
   p2=serchposition(d2,a,fora,n);
   for(int x=i+1; x<n; x++)
   {
      for(int y=0; y<m; y++)
      {
         if(y==0)
         {
            y1=matr[x][y];
         }
         else
         {
            y2=matr[x][y];
         }
      }
      q1=serchposition(y1,a,fora,n);
      q2=serchposition(y2,a,fora,n);
      if((p1==q1)&&(p2==q2))
      {
         forArray=forArray+1;
         Array = new int * [forArray];                        //создаем
         for (int i=0; i<forArray; i++) Array[i]=new int [n]; //новый массив Аrray
         for(int k=0; k<forArray; k++)
         {
            for(int z=0; z<n; z++)
            {
               Array[k][z]=-1;
            }
         }
         funk1(n,fora,i,x,Array,a);    
      }
   }
      for (int i=0; i<fora; i++) delete [] a[i];  //удаляем
   delete [] a;                                //массив А
   fora=forArray;                //новая расзмерность массива А ровна старой размерности массива Array
   a = new int * [fora];                     //создаем
   for (int i=0; i<fora; i++) a[i]=new int [n]; //новый массив А
 
   for(int i=0; i<forArray; i++)   //копируем
   {                               //элементы массива Array в
      for(int j=0; j<n; j++)       //массиву А
      {
      a[i][j]=Array[i][j];    //--------------------ВОТ ТУТ РУГАЕТСЯ------------------------------
      }
   }
 
   for (int i=0; i<forArray; i++) delete [] Array[i];  //удаляем
   delete [] Array;                                    //массив Аrray
}
//--------------------------------------
         cout<<'\n';            cout<<'\n';
 
 
 
bool prov;
cout<<"---------------------------------------------"<<'\n';
int o=1;
for(int i=0; i<fora; i++)
{
   prov=proverka(i,n,a);
   if(prov==true)
   {
   cout<<"class"<<o<<"  ";
      for(int j=0; j<n; j++)
      {
         if(a[i][j]!=-1)
         {
         cout<<a[i][j]<<" ";
         }
      }
      cout<<'\n';
      o++;
   }
}
}
 
//---------------------------------------------------------------------------
int serchposition(int d, int** a, int fora, int n)
{
   for(int i=0; i<fora; i++)
   {
      for(int j=0; j<n; j++)
      {
         if(a[i][j]==d)return i;
      }
   }
return 1000;
}
//---------------------------------------------------------------------------
void funk1(int n, int fora, int i, int x, int** Array, int**a)
{
         for(int i1=0; i1<fora; i1++)    //вместо fora было forArray-1
         {
            for(int j1=0; j1<n; j1++)
            {
               if(a[i1][j1]==i || a[i1][j1]==x){Array[i1][j1]=-1;}
               else{Array[i1][j1]=a[i1][j1];}
               Array[fora][0]=i;
               Array[fora][1]=x;
            }
         }
}
//---------------------------------------------------------------------------
bool proverka (int i, int n, int** a)          //проверка на наличие подкласса при выводе
{                                              //строки со всеми (-1) возвращают значение
bool prov=true;                                //FALSE
    for(int y=0; y<n; y++)
      {
      if(a[i][y]!=-1)
        {
        prov=true;
        return prov;
        }
      else
        {
        prov=false;
        return prov;
        }
      }
return prov;
}
//---------------------------------------------------------------------------
Вот скрин с ошибкойПамять не может быть прочитана!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2011, 01:34     Память не может быть прочитана!
Посмотрите здесь:

Память не может быть "written" C++
Где может быть ошибка? C++
C++ где может быть ошибка на с++
C++ деструктор не может очистить память
C++ В чём может быть ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.08.2011, 01:56     Память не может быть прочитана! #2
напиши что и куда копируешь(опиши аргументы функций), а то спагетти слиплись
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
25.08.2011, 17:48  [ТС]     Память не может быть прочитана! #3
Восле всяческого рода преобразований указонных в коде до надписи "//ВОТ ТУТ РУГАЕТСЯ", поэлементно копируются элементы массива "Array" в массив "a".

Добавлено через 49 секунд
а аргументы те же что и параметры.

Добавлено через 14 часов 13 минут
Плз не сочтите за навящивость но срочно нужна помощь
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
25.08.2011, 17:55     Память не может быть прочитана! #4
Ну а чем тебе помочь, если в функции сам чёрт ногу сломит?
Вот например, в строках 18 и 19 массив Array удаляется.
Дальше, в строках 51—64, в принципе, наверное создаётся. А есть уверенность, что создаётся? А если создаётся, то есть уверенность, что только один раз?
-=ЮрА=-
Заблокирован
Автор FAQ
25.08.2011, 17:57     Память не может быть прочитана! #5
Цитата Сообщение от gr_8_zizu Посмотреть сообщение
delete [] Array[i]; *//удаляем
delete [] Array; * * * * * * * * * * * * * * * * * *//массив Аrray
- зачем это делать ведь судя из твоего топика

Цитата Сообщение от gr_8_zizu Посмотреть сообщение
Array={{-1,-1,-1,-1,-1,-1,-1},{0,1,2,3,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},{5,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},{4,6,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1},}
- он статический...

Добавлено через 54 секунды
gr_8_zizu, давай весь код, если нужна оперативность
Сыроежка
Заблокирован
25.08.2011, 18:46     Память не может быть прочитана! #6
Чтобы быстрей найти ошибку, вставьте в свою функцию part2 печать своего массива Array точно также, как вы это делаете с помощью циклов


C++
1
2
3
4
5
6
7
8
for(int i=0; i<forArray; i++)
{
   for(int j=0; j<n; j++) 
   {
       printf( "%d; ", Array[i][j] );
   }
   printf( "\n" );
}
И будет ясно, проблема в вашем массиве Array, или еще в чем-то.
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
25.08.2011, 20:14  [ТС]     Память не может быть прочитана! #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- зачем это делать ведь судя из твоего топика

- он статический...

Добавлено через 54 секунды
gr_8_zizu, давай весь код, если нужна оперативность
Массив Array не статический его я просто в функцию передаю, а там до етого момента еще очень много кода и я не стал кидать его что бы не запаривать вам мозги не нужным кодом. В связи с этим просто написал параметры которые будут переданы для конкретного примера.

Добавлено через 1 минуту
Цитата Сообщение от Сыроежка Посмотреть сообщение
Чтобы быстрей найти ошибку, вставьте в свою функцию part2 печать своего массива Array точно также, как вы это делаете с помощью циклов


C++
1
2
3
4
5
6
7
8
for(int i=0; i<forArray; i++)
{
   for(int j=0; j<n; j++) 
   {
       printf( "%d; ", Array[i][j] );
   }
   printf( "\n" );
}
И будет ясно, проблема в вашем массиве Array, или еще в чем-то.
это уже делал, проблема с массивом Array все же была, вы правы.
Сыроежка
Заблокирован
25.08.2011, 20:16     Память не может быть прочитана! #8
Так вы не сделали, что я сказал? Следовало бы сделать!

Я также обратил внимание, что в функции параметр int& fora объявлен по ссылке. Так что вполне возможно, если эта функция вызывается неоднократно, что у вас значение этого аргумента не то, что вы предполагаете, при следующем вызове функции.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2011, 20:17     Память не может быть прочитана!
Еще ссылки по теме:

Память не может быть прочитала C++
C++ Может ли быть такое?
По каким причинам память не может быть выделена динамически? C++

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

Или воспользуйтесь поиском по форуму:
gr_8_zizu
13 / 8 / 2
Регистрация: 07.01.2011
Сообщений: 149
25.08.2011, 20:17  [ТС]     Память не может быть прочитана! #9
Всем спасибо. Уже разобрался с ошибкой. Дело было в том что массив Array создавался только в том случае когда p1==q1 и p2==q2, а дальше нужно было копировать массив Array в массив а. Так вот если не выполнялось бы условие p1==q1 и p2==q2 то массив не создавался бы, но тем не менее нада было копировать его в массив а. А так как массив Array был удален, а создан не был, выдавалась ошибка.
Yandex
Объявления
25.08.2011, 20:17     Память не может быть прочитана!
Ответ Создать тему
Опции темы

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