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
Оценка:
Дай минимальный код, компилируемый и дающий эту ошибку. Возможно, при попытке выделить этот код, ты сам ошибку найдешь
> 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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
А>В одной из функций класса 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;
А>}
А>
А>Я новичок в программировании и первый раз с таким сталкиваюсь. Всем, кто поможет, буду очень признателен.
В конструкторе переменная не инициализируется. Инициализируется по умполчанию только константные статические члены
А>И внутри функции 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."
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Ошибка где-то раньше. Скорее всего, вызывается функция-член через нулевой указатель. Т.е. CBall::this скорее всего == NULL.
Это странно, потому что я выделил объекту память в стеке вот в этой строчке:
ПК>> Ошибка где-то раньше. Скорее всего, вызывается функция-член через ПК>> нулевой указатель. Т.е. CBall::this скорее всего == NULL.
> Это странно, потому что я выделил объекту память в стеке вот в этой строчке:
>
> CLine borders[3];
>
Я правильно понимаю, что borders -- член класса CBall? В таком случае, как создается объект CBall?
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>>> Ошибка где-то раньше. Скорее всего, вызывается функция-член через ПК>>> нулевой указатель. Т.е. CBall::this скорее всего == NULL.
>> Это странно, потому что я выделил объекту память в стеке вот в этой строчке:
>>
>> CLine borders[3];
>>
ПК>Я правильно понимаю, что borders -- член класса CBall? В таком случае, как создается объект CBall?
Да, borders — это член CBall (см. код в первом сообщении). Объекты CBall — это члены класса CBallsView:
class CBallsView : public CView
{
private:
CBall m_ball1;
CBall m_ball2;
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Анатолий Широков, Вы писали:
АШ>>А CBall-у где выделена память?
А>Да, тоже в стеке. Объекты класса CBall — это члены CBallsView.
ПК>> Я правильно понимаю, что 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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Анатолий Широков, Вы писали:
АШ>>Хорошо, а где создается CBallsView?
А>Это наследник CView. Вроде это элемент каркаса MFC.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Тогда где создается CBallsView?
ПК>На самом деле все проще: расставь assert( this != NULL ) вверх по стеку, или ПК>посмотри на стек вызовов в отладчике, и увидишь, какая из функций вызывается ПК>с this == 0.
CBallsView — это наследник CView. Вроде бы это элемент каркаса MFC.
ASSERT(this != NULL) не сработал даже в CLine::Init, в которой выскакивает ошибка. Наверное потому что this == 0x00000030.
А в стеке вызовов в отладчике разве видно значение this?
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Хорошо, давай разберемся.
АШ>я объявляю класс:
АШ>
АШ>class CBallsView : public CView
АШ>{
АШ>....
АШ>};
АШ>
АШ>создаю объект в стеке
АШ>
АШ>void foo()
АШ>{
АШ> CBallsView view;
АШ>}
АШ>
АШ>создаю объект в "куче"
АШ>
АШ>CBallsView* view = new CBallsView;
АШ>
АШ>А где ты создаешь?
Кстати говоря, когда я читал книжку по MFC, то меня тоже интересовало, где создается объект класса, наследника CView. Но вряд ли это имеет отношение к проблеме, потому что если не создавать объектов CBall, то ошибок не возникает.
> CBallsView — это наследник CView. Вроде бы это элемент каркаса MFC.
А где он создается?
> ASSERT(this != NULL) не сработал даже в CLine::Init, в которой > выскакивает ошибка. Наверное потому что this == 0x00000030.
Все правильно: это означает, что this содержащего его класса, начало
которого отстоит на 0x30, как раз 0.
> А в стеке вызовов в отладчике разве видно значение this?
Да.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
А>Кстати говоря, когда я читал книжку по MFC, то меня тоже интересовало, где создается объект класса, наследника CView. Но вряд ли это имеет отношение к проблеме, потому что если не создавать объектов CBall, то ошибок не возникает.
Создает их CDocumentManager. Посмотри, может ты обращается к своим объектам до инициализации самого приложения и вызова главной формы?
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])
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])