С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
1

Ошибка Access Violation

04.04.2012, 15:22. Просмотров 1582. Ответов 14
Метки нет (Все метки)

Собственно, проблемма:
Есть класс, в котором есть переменные (3 шт):
C++
1
2
3
4
5
6
class wField
{
protected:
  int Vert;
  int Gor;
  char* *f;
В нем есть метод
C++
1
2
3
4
5
6
7
8
9
10
11
char CellState(int Row, int Col)
{
  if((Row>=Vert)||(Row<0)||(Col>=Gor)||(Col<0))
    return 'w';
  else if(f[Row][Col]=='0')
    return '0';
  else if (f[Row][Col]=='1')
    return '1';
  else
    return 'e';
}
Когда я пытаюсь скомпилировать проэкт с этим классом в С++Builder'е, я получаю ошибку:
"Access Violation at address 00403c4f in module #####. Read of address 000000c2."
При использовании класса в Visual Studio 10 метод не только работает, но еще и работает правильно.
В чем проблемма?
Заранее спасибо за ваши ответы
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2012, 15:22
Ответы с готовыми решениями:

Ошибка Unhandled Exception, Access Violation
Странная проблема, на самом деле.. пишу следующее: #include &lt;fstream.h&gt;...

Ошибка Access violation writing location
Структура и объявление массива: struct Particle { float X; float Y;...

Ошибка Access Violation при записи
void Texts :: setC_String() { str=strb; str-&gt;setC_String();//здесь...

__asm ошибка Access violation writing location
Код ниже выводит следующую ошибку &quot;Unhandled exception at 0x004116a7 in...

ошибка Access violation reading location 0x00000066
Ошибка : Unhandled exception at 0x100e14cf (msvcr100d.dll) in 3.4.exe:...

14
LK
Заблокирован
04.04.2012, 15:44 2
Access Violation в деталях
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 15:52  [ТС] 3
Знаю, читал. Вот только я проверял свои переменные Row и Col, и они не выходят за пределы массива. Что подтверждается нормальной работой в Visual Studio.
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
04.04.2012, 16:20 4
Тут важно следить, чтобы подобные методы вызывались гарантированно после выделения памяти под массив.
Цитата Сообщение от UFO94 Посмотреть сообщение
Вот только я проверял свои переменные Row и Col, и они не выходят за пределы массива.
А f при этом имеет валидное значение?
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
04.04.2012, 18:35  [ТС] 5
Да, f валидно. Я пробовал ставить проверку на f==NULL, и она не срабатывала, т.е. память под f нормально выделялась
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
04.04.2012, 23:55 6
Цитата Сообщение от UFO94 Посмотреть сообщение
Read of address 000000c2
Данный адрес говорит, что проблемы именно с указателем, в точности была попытка использовать какое-то значение в качестве указателя, которое указателем не является. Если Вы правильно определили метод, который эту ошибку вызывает, то тут возможны три варианта: f имеет невалидное значение, один из указателей f[row] имеет невалидное значение, либо row принимает недопустимое значение.
1
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 00:12  [ТС] 7
Спасибо, kazak, проблемма несколько сузилась. Указатели f[1] и f[9] (и только они) -- валидны, но при попытке использовать любой из элементов f[1][i], f[9][i] получаем Access Violation, только ошибка теперь 0000002D
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
05.04.2012, 00:45 8
А можно глянуть код как выделяется память под **f?
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 01:02  [ТС] 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wField(int VertSize, int GorSize, char* *g)
        {
    Vert=VertSize;
    Gor=GorSize;
    f=new char*[Vert];
    for(int i=0; i<Vert; i++)
    {
        f[i]=new char[Gor];
        for(int j=0; j<Gor; j++)
                {
                f[i][j]=g[i][j];
                }
    }
        if(f==NULL)
        wField(-1);
        }
0
Toshkarik
1150 / 867 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
05.04.2012, 01:13 10
Вот что нашел на этом же форуме Access violation at address ?????? возможно поможет, думаю стоит обратить внимание на последние 2 сообщения.
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 02:04  [ТС] 11
Иными словами, использовать Debuger и программы, ему аналогичные... попробуем...
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
05.04.2012, 06:15 12
Цитата Сообщение от UFO94 Посмотреть сообщение
Указатели f[1] и f[9] (и только они) -- валидны, но при попытке использовать любой из элементов f[1][i], f[9][i] получаем Access Violation
Как они могут быть валидными, если получаем ошибку?

Цитата Сообщение от UFO94 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wField(int VertSize, int GorSize, char* *g)
 {
 Vert=VertSize;
 Gor=GorSize;
 f=new char*[Vert];
 for(int i=0; i<Vert; i++)
 {
 f[i]=new char[Gor];
 for(int j=0; j<Gor; j++)
 {
 f[i][j]=g[i][j];
 }
 }
 if(f==NULL)
 wField(-1);
 }
Логичнее было бы проверять выделилась ли память непостредственно после выделения. Причем контролировать нужно все попытки выделить память. Плюс new может и не возращать нулевой указатель при неудаче.
1
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
05.04.2012, 09:16  [ТС] 13
Цитата Сообщение от kazak Посмотреть сообщение
Как они могут быть валидными, если получаем ошибку?
Я имел в виду, они не NULL.
0
kazak
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
05.04.2012, 11:53 14
Валидный означает, что указатель указывает на рабочую область памяти (valid - допустимый, действительный, достоверный, правильный, имеющий силу), а не имеет какое-то случайное значение.
0
UFO94
264 / 253 / 23
Регистрация: 04.04.2012
Сообщений: 546
07.04.2012, 14:35  [ТС] 15
Проблемма решена. Как оказалось, я забыл написать конструктор копий или оператор=, но использовал их в программе, вследствие чего класс корректно не копировался. Всем спасибо, кто помогал, тему можно закрывать.
0
07.04.2012, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 14:35

Массивы указателей и ошибка Access violation reading location
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class...

Ошибка (access violation) при обращении к элементу динамического массива структур
Добрый день! Все прекрасно работает если в структуре статические массивы. Но...

Ошибка raised exception class EAccessViolation with message 'Access violation at address 004011FA
Выдает ошибку raised exception class EAccessViolation with message 'Access...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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