Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Помогите разобратся почему прога вылетает


Автор: knut 2.9.2006, 14:58
Привет всем.
Помогите разобратся.почему прога вылетает при бxоде в if(bDR) 
//Error:: Unhandled exe.
polygon ето метод класса 
Код

void polygon()
    {
    for(vector<CPoint>::iterator it = p_vec.begin();it!=p_vec.end();it++ )
        {
        for(vector<CPoint>::iterator it1 = p_vec.begin();it1!=p_vec.end();it1++)
            {
        
            if((*it) == (*it1))
            continue;
                a = (*it).y - (*it1).y;
                b = (*it).x - (*it1).x;

                if(b!=0)
                {
                    K = a/b;
                }
                B = (*it).y - K*(*it).x;
                bDR = true;
                
                if((K > 0 && a < 0) || (K < 0 && a > 0) )
                {
                for(vector<CPoint>::iterator it2 = p_vec.begin();it2!vec.end();it2++)
                    {
                if(((*it2).y - K*(*it2).x - B) > 0 && ((*it2)!=(*it) &&(*it2)!=(*it1)) )
                        {
                            bDR = false;
                            break;
                        }
                    }
                }
                else
                {
            for(vector<CPoint>::iterator it2 = p_vec.begin();it2!=p_vec.end();it2++)
                    {
            if(((*it2).y - K*(*it2).x - B) < 0 && ((*it2)!=(*it) &&(*it2)!=(*it1)) )
                        {
                            bDR = false;
                            break;
                        }
                    }
                }

                if(bDR)
                {
                    
                    P_DC->MoveTo((*it).x,(*it).y);
                    P_DC->LineTo((*it1).x,(*it1).y);

                }
                
            }
        }
    }



Зараниее мерси.

Автор: ptr 2.9.2006, 15:20
Давай весь класс, с примером кода когда падает, а не один метод smile .

Автор: zkv 2.9.2006, 16:32
2knut, ptr прав, так трудно что то сказать, единственное что сразу бросилось в глаза, это 
стр. 20 
Код

(K > 0 && a < 0)

я не помню таблицу приоритетов наизусть, поэтому всегда ставлю скобки:
Код

( (K > 0) && (a < 0) )

и если приоритет у && выше чем у < (повторюсь, я не знаю точно, только предположение), то может здесь какие нибудь проблемы возникают? 

IMHO:   it->y;  визуально воспринимается легче чем (*it).y; 

Автор: knut 2.9.2006, 16:46
задча такова над построить выпулую оболочку.
Код

class LINE
{
public:
    Line();

public:
    vector<CPoint>p_vec;
    CRect rect;
    CDC *P_DC;
    double a,b,B,K;
    bool bDR;

public:
    void Select( CPoint m_point)//заносим все точки в вектор.
    {
        
        p_vec.push_back(m_point);
    
    }
    void Drow(CDC*p_DC) //рисуем точки.
    {
        for(vector<CPoint>::iterator it = p_vec.begin();it!=p_vec.end();it++)
        {
            rect.SetRect((*it).x + 5,(*it).y + 5,(*it).x - 5,(*it).y - 5);
            p_DC->Ellipse(rect);
        }
        
        
    }
    void polygon()//наxодет те точки из множество точек которие должны быть в выпуклои оболочки. 
    {
        for(vector<CPoint>::iterator it = p_vec.begin();it!=p_vec.end();it++ )
        {
            for(vector<CPoint>::iterator it1 = p_vec.begin();it1!=p_vec.end();it1++)
            {
                //if(((*it).x = (*it1).x) && ((*it).y == (*it1).y))
                if((*it) == (*it1))
                
                    continue;
                a = (*it).y - (*it1).y;
                b = (*it).x - (*it1).x;

                if(b!=0)
                {
                    K = a/b;
                }
                B = (*it).y - K*(*it).x;
                bDR = true;
                
                if((K > 0 && a < 0) || (K < 0 && a > 0) )
                {
            for(vector<CPoint>::iterator it2 = p_vec.begin();it2!=p_vec.end();it2++)
                {
                if(((*it2).y - K*(*it2).x - B) > 0 && ((*it2)!=(*it) &&(*it2)!=(*it1))   )
                        {
                            bDR = false;
                            break;
                        }
                    }
                }
                else
                {
            for(vector<CPoint>::iterator it2 = p_vec.begin();it2!=p_vec.end();it2++)
                    {
                if(((*it2).y - K*(*it2).x - B) < 0 && ((*it2)!=(*it) &&(*it2)!=(*it1))        )
                        {
                            bDR = false;
                            break;
                        }
                    }
                }

                if(bDR)
                {
                    //здесь вылетает
                    
                    P_DC->MoveTo((*it).x,(*it).y);
                    P_DC->LineTo((*it1).x,(*it1).y);
                }
                
            }
        }
    }

    
};
//class view

Код

void CNewView::OnDraw(CDC* pDC)
{
    CNewDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    
    p_Line->Drow(pDC);
    Invalidate(false);

    
    }

void CNewView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    p_Line->Select(point);
    
    Invalidate(false);
    

    CView::OnLButtonDown(nFlags, point);
}
void CNewView::OnPaint() 
{
    CPaintDC dc(this); 
    p_Line->Drow(&dc);

        
}



Автор: Rockie 2.9.2006, 17:05
креативная вставка в коде  smile 

Зачем у тебя указано 3 раза public. 
Что за тип CRect, его нет в коде который ты привел

Автор: ptr 2.9.2006, 17:12
knut, если не секрет, то где была выделена память под 
Код

CDC *P_DC;
?

Автор: zkv 2.9.2006, 17:14
knut
интересно, а как вот это все инициализируется:
Код

public:                              //судя по public, внешними функциями? (ИМХО нехорошо)
    vector<CPoint>p_vec;
    CRect rect;
    CDC *P_DC;
    double a,b,B,K;
    bool bDR;

и вообще, ты выложил только код класса, который сам по себе ничего не делает, нужно же еще показать как ты этот класс потом конкретно применяешь, т.е. как члены инициализируешь, какие методы вызываешь...

Автор: knut 2.9.2006, 17:24
ptr 
P_CD ето указатель типа CDC класса если внимателно посматреть я исползобвал (p_DC)такой же указател в коде  и некакиx проблем. 

Автор: zkv 2.9.2006, 17:33
Цитата(knut @  2.9.2006,  17:24 Найти цитируемый пост)
P_CD ето указатель типа CDC класса если внимателно посматреть я исползобвал (p_DC)такой же указател в коде  и некакиx проблем.  

smile
Код

int *a=0; // указатель 
int *b=0; // такой же указатель
a = new int;
*a = 1;  //будет работать 
*b = 1; //не будет работать 

Автор: vinter 2.9.2006, 17:38
Цитата

Зачем у тебя указано 3 раза public. 

так кстати даже визард делает, чтобы как то различать где данные, где конструктор, а где методы класса, просто для глаз приятнее ИМХО
Цитата

Что за тип CRect, его нет в коде который ты привел

Это стандартный тип Visual'a


Автор: ptr 2.9.2006, 17:43
Цитата(knut @  2.9.2006,  21:24 Найти цитируемый пост)
P_CD ето указатель типа CDC класса если внимателно посматреть я исползобвал (p_DC)такой же указател в коде  и некакиx проблем.  

При чём тут p_DC? Я тебя не про это спрашивал. Где ты создаешь объект для P_DC?

Цитата(knut @  2.9.2006,  21:24 Найти цитируемый пост)
P_CD ето указатель типа CDC класса

Это я заметил smile .

Да и вообще, если хочешь чтобы тебе быстро помогли, то выкладывай весь код, а не по частям.

Автор: zkv 2.9.2006, 17:48
Цитата(vinter @  2.9.2006,  17:38 Найти цитируемый пост)

Цитата

Зачем у тебя указано 3 раза public. 

так кстати даже визард делает, чтобы как то различать где данные, где конструктор, а где методы класса, просто для глаз приятнее ИМХО

согласен, только в этом случае непонятно почему 3 а не 2 раза (не понятно зачем обособили Line(), если бы он был единственным интерфейсным методом, было бы понятно)

Добавлено @ 17:50 
Цитата(vinter @  2.9.2006,  17:38 Найти цитируемый пост)

Цитата

Что за тип CRect, его нет в коде который ты привел

Это стандартный тип Visual'a


я бы сказал класс из MFC

Автор: knut 3.9.2006, 12:15
Подскажите только одно пчему в этом отрезке у меня прога вылетает как толко она заxодет в if() цыкл. дтугово не надо
Код

if(bDR)
    {
    P_DC->MoveTo(it->x,it->y); // P_DC это указатель типа CDC класса.
    P_DC->LineTo(it1->x,it1->y);
}

проблема связанна с MoveТо() и LineTo().

Автор: vinter 3.9.2006, 12:31
у тебя же ptr русским по белому спросил: ГДЕ ТЫ ВЫДЕЛЯЕШЬ ПАМЯТЬ ПОД P_DC?????
что такое it и it1????
Скорее всего у тебя P_DC - "bad ptr"
кинь весь код и проблемы сразу решатся!!!

Автор: bsa 3.9.2006, 12:45
knut, надеюсь ты знаешь, что Line() - это не конструктор для class LINE? smile

Автор: knut 3.9.2006, 12:51
Извените коночно за столь глупый вопрос (я бы сказал ламерский) а где правилние выделять память для P_DC в конструкторе или же при иницализацые.

Автор: bsa 3.9.2006, 13:07
Логичнее в конструкторе - он вызывается всегда при создании объекта. И не надо помнить о том, что еще что-то надо вызвать. ;)
Если у тебя много разных конструкторов данного класса, то имеет смысл общие операции инициализации вынести в закрытый общий инициализирующий метод, который будет вызываться из каждого конструктора.
Кстати, раз ты в конструкторе выделяешь память, то не забудь определить для данного класса деструктор (~LINE()), который будет удалять этот CDC, иначе утечек памяти не избежать, а также конструктор копирования (LINE(const LINE &value)) и оператор присваивания (operator=(const LINE &value)), если собираешься ими пользоваться, иначе будут "unhandled exception".

Автор: MAKCim 3.9.2006, 16:17
bsa
с другой стороны если объект важный или требует много ресурсов
то расточительно его создавать в конструкторе - ведь может так случится, что он и не потребуется
то есть я хочу сказать что объект можно еще создавать в месте где есть к нему обращение 

Автор: knut 5.9.2006, 09:51
Всем спасибо вопрос закрыт.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)