Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:06
Оценка:
Вот фрагмент кода класса CBall:

class CBall
{
private:    
    CLine borders[3];


В одной из функций класса CBall пишу следующее:

    borders[0].Init(1, 1, 1);
    //инициализация прямой тремя коэффициентами


И внутри функции CLine::Init на этапе исполнения прогаммы выскакивает ошибка Unhandled exception at 0x004179e1 in Balls.exe: 0xC0000005: Access violation writing location 0x00000030.

void CLine::Init(double initA, double initB, double initC)
{
    a = initA;//ошибка вот на этой строчке, при этом this = 0x00000030
    b = initB;
    c = initC;
}


Я новичок в программировании и первый раз с таким сталкиваюсь. Всем, кто поможет, буду очень признателен.
Re: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:09
Оценка:
Дай минимальный код, компилируемый и дающий эту ошибку. Возможно, при попытке выделить этот код, ты сам ошибку найдешь
Re: Access violation writing location 0x00000030
От: Павел Кузнецов  
Дата: 26.07.05 15:10
Оценка:
>
 > void CLine::Init(double initA, double initB, double initC)
 > {
 >  a = initA;//ошибка вот на этой строчке, при этом this = 0x00000030
 >  b = initB;
 >  c = initC;
 > }
 >

> Я новичок в программировании и первый раз с таким сталкиваюсь. Всем, кто
> поможет, буду очень признателен.

Ошибка где-то раньше. Скорее всего, вызывается функция-член через нулевой указатель. Т.е. CBall::this скорее всего == NULL.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Access violation writing location 0x00000030
От: dvurukov США  
Дата: 26.07.05 15:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот фрагмент кода класса CBall:


А>
А>class CBall
А>{
А>private:    
А>    CLine borders[3];        
А>


А>В одной из функций класса CBall пишу следующее:


А>
А>    borders[0].Init(1, 1, 1);
А>    //инициализация прямой тремя коэффициентами
А>


А>И внутри функции CLine::Init на этапе исполнения прогаммы выскакивает ошибка Unhandled exception at 0x004179e1 in Balls.exe: 0xC0000005: Access violation writing location 0x00000030.


А>
А>void CLine::Init(double initA, double initB, double initC)
А>{
А>    a = initA;//ошибка вот на этой строчке, при этом this = 0x00000030
А>    b = initB;
А>    c = initC;
А>}
А>


А>Я новичок в программировании и первый раз с таким сталкиваюсь. Всем, кто поможет, буду очень признателен.


В конструкторе переменная не инициализируется. Инициализируется по умполчанию только константные статические члены
Re: Access violation writing location 0x00000030
От: AndrewJD США  
Дата: 26.07.05 15:16
Оценка:
Здравствуйте, Аноним, Вы писали:


А>И внутри функции CLine::Init на этапе исполнения прогаммы выскакивает ошибка Unhandled exception at 0x004179e1 in Balls.exe: 0xC0000005: Access violation writing location 0x00000030.


А>
А>void CLine::Init(double initA, double initB, double initC)
А>{
А>    a = initA;//ошибка вот на этой строчке, при этом this = 0x00000030
А>    b = initB;
А>    c = initC;
А>}
А>


Вызываешь через нулевой указатель. this == 0
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[2]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:26
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ошибка где-то раньше. Скорее всего, вызывается функция-член через нулевой указатель. Т.е. CBall::this скорее всего == NULL.


Это странно, потому что я выделил объекту память в стеке вот в этой строчке:

CLine borders[3];
Re[3]: Access violation writing location 0x00000030
От: Павел Кузнецов  
Дата: 26.07.05 15:28
Оценка:
ПК>> Ошибка где-то раньше. Скорее всего, вызывается функция-член через
ПК>> нулевой указатель. Т.е. CBall::this скорее всего == NULL.

> Это странно, потому что я выделил объекту память в стеке вот в этой строчке:


>
 > CLine borders[3];
 >


Я правильно понимаю, что borders -- член класса CBall? В таком случае, как создается объект CBall?
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:29
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Вызываешь через нулевой указатель. this == 0


Я выделил память объекту в стеке вот в этой строке:
CLine borders[3];

Почему же this == 0?
Re[3]: Access violation writing location 0x00000030
От: Анатолий Широков СССР  
Дата: 26.07.05 15:32
Оценка:
А>Я выделил память объекту в стеке вот в этой строке:
А>
А>CLine borders[3];
А>

А>Почему же this == 0?

А CBall-у где выделена память?
Re[4]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:33
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>>> Ошибка где-то раньше. Скорее всего, вызывается функция-член через

ПК>>> нулевой указатель. Т.е. CBall::this скорее всего == NULL.

>> Это странно, потому что я выделил объекту память в стеке вот в этой строчке:


>>
 >> CLine borders[3];
 >>


ПК>Я правильно понимаю, что borders -- член класса CBall? В таком случае, как создается объект CBall?


Да, borders — это член CBall (см. код в первом сообщении). Объекты CBall — это члены класса CBallsView:
class CBallsView : public CView
{
private:
    CBall m_ball1;
    CBall m_ball2;
Re[4]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:35
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>А CBall-у где выделена память?


Да, тоже в стеке. Объекты класса CBall — это члены CBallsView.
Re[5]: Access violation writing location 0x00000030
От: Анатолий Широков СССР  
Дата: 26.07.05 15:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>А CBall-у где выделена память?


А>Да, тоже в стеке. Объекты класса CBall — это члены CBallsView.


Хорошо, а где создается CBallsView?
Re[5]: Access violation writing location 0x00000030
От: Павел Кузнецов  
Дата: 26.07.05 15:37
Оценка:
ПК>> Я правильно понимаю, что borders -- член класса CBall? В таком случае,
ПК>> как создается объект CBall?

> Да, borders — это член CBall (см. код в первом сообщении). Объекты CBall

> — это члены класса CBallsView:
 > class CBallsView : public CView
 > {
 > private:
 >  CBall m_ball1;
 >  CBall m_ball2;
 >


Тогда где создается CBallsView?

На самом деле все проще: расставь assert( this != NULL ) вверх по стеку, или
посмотри на стек вызовов в отладчике, и увидишь, какая из функций вызывается
с this == 0.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:41
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Хорошо, а где создается CBallsView?


Это наследник CView. Вроде это элемент каркаса MFC.
Re[7]: Access violation writing location 0x00000030
От: Анатолий Широков СССР  
Дата: 26.07.05 15:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>Хорошо, а где создается CBallsView?


А>Это наследник CView. Вроде это элемент каркаса MFC.


Хорошо, давай разберемся.

я объявляю класс:

class CBallsView : public CView
{
....
};


создаю объект в стеке

void foo()
{
   CBallsView view;
}


создаю объект в "куче"

CBallsView* view = new CBallsView;


А где ты создаешь?
Re[6]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:52
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Тогда где создается CBallsView?


ПК>На самом деле все проще: расставь assert( this != NULL ) вверх по стеку, или

ПК>посмотри на стек вызовов в отладчике, и увидишь, какая из функций вызывается
ПК>с this == 0.

CBallsView — это наследник CView. Вроде бы это элемент каркаса MFC.

ASSERT(this != NULL) не сработал даже в CLine::Init, в которой выскакивает ошибка. Наверное потому что this == 0x00000030.

А в стеке вызовов в отладчике разве видно значение this?
Re[8]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 15:58
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Хорошо, давай разберемся.


АШ>я объявляю класс:


АШ>
АШ>class CBallsView : public CView
АШ>{
АШ>....
АШ>};
АШ>


АШ>создаю объект в стеке


АШ>
АШ>void foo()
АШ>{
АШ>   CBallsView view;
АШ>}
АШ>


АШ>создаю объект в "куче"


АШ>
АШ>CBallsView* view = new CBallsView;
АШ>


АШ>А где ты создаешь?


Кстати говоря, когда я читал книжку по MFC, то меня тоже интересовало, где создается объект класса, наследника CView. Но вряд ли это имеет отношение к проблеме, потому что если не создавать объектов CBall, то ошибок не возникает.
Re[7]: Access violation writing location 0x00000030
От: Павел Кузнецов  
Дата: 26.07.05 16:02
Оценка:
> CBallsView — это наследник CView. Вроде бы это элемент каркаса MFC.

А где он создается?

> ASSERT(this != NULL) не сработал даже в CLine::Init, в которой

> выскакивает ошибка. Наверное потому что this == 0x00000030.

Все правильно: это означает, что this содержащего его класса, начало
которого отстоит на 0x30, как раз 0.

> А в стеке вызовов в отладчике разве видно значение this?


Да.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[9]: Access violation writing location 0x00000030
От: Анатолий Широков СССР  
Дата: 26.07.05 16:03
Оценка:
А>Кстати говоря, когда я читал книжку по MFC, то меня тоже интересовало, где создается объект класса, наследника CView. Но вряд ли это имеет отношение к проблеме, потому что если не создавать объектов CBall, то ошибок не возникает.

Создает их CDocumentManager. Посмотри, может ты обращается к своим объектам до инициализации самого приложения и вызова главной формы?
Re[9]: Access violation writing location 0x00000030
От: Павел Кузнецов  
Дата: 26.07.05 16:03
Оценка:
> отношение к проблеме, потому что если не создавать объектов CBall, то
> ошибок не возникает.

Тогда все может быть хуже. Где-то в результате твоей ошибки может портиться память.
Выделяй минимальный пример, на котором воспроизводится эта ошибка.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[8]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 16:12
Оценка:
Большое спасибо, я нашел ошибку:
    CVect vertex[3];
    vertex[0].Set(0, 0);
    vertex[1].Set(MaxX, 0);
    vertex[2].Set(MaxX, MaxY);
    vertex[3].Set(0, MaxY);//для этого элемента массива не выделена память (надо было писать CVect vertex[4])
Re[10]: Access violation writing location 0x00000030
От: Аноним  
Дата: 26.07.05 16:13
Оценка:
Большое спасибо, я нашел ошибку:
    CVect vertex[3];
    vertex[0].Set(0, 0);
    vertex[1].Set(MaxX, 0);
    vertex[2].Set(MaxX, MaxY);
    vertex[3].Set(0, MaxY);//для этого элемента массива не выделена память (надо было писать CVect vertex[4])
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.