Необработанное Исключение В "0x00412b4a" В "kursovik.ex

Тема в разделе "Общие вопросы по С и С++", создана пользователем Best, 24 ноя 2011.

Статус темы:
Закрыта.
  1. Best

    Best Гость

    Программа компилируется нормально но потом на строчке
    Код (C++):
    MoveToEx(hdc,Mas[Spis[i].a]->x*20,Mas[Spis[i].a]->y*20,0);
    выдаёт ошибку
    Помогите пожалуйста заранее спасибо.

    Код (C++):
    #include "stdafx.h"
    #include <windows.h>
    #include "resource.h"
    #include <string>
    #define MAXPOINTS 1000

    int ko,key1=0;
    int kolreb;

    struct spis
    {
    int x,y;
    int c;
    int n;
    spis *next;
    };
    spis *first = NULL;

    spis **Mas;//массив координат

    struct rebro
    {
    int a,b,l;
    int flag;
    };

    rebro *Spis = NULL;
    rebro *curr_rebro;

    int n,kolr,step,kolvern=0, kolnev=0;

    bool AddError = true;


    void memfree()
    {
    int i;
    spis *st, *sp;
    st=first;
    while (st!=NULL)
    {
    sp=st;
    st=st->next;
    delete sp;
    }
    first=NULL;
    Mas=NULL;
    n=0;
    step=0;
    kolr=0;
    }

    void masPOINT()
    {
    int i, j, k;
    spis *st;
    Mas = new spis*[n];
    Spis = new rebro[n*(n-1)/2];

    for(i=n, st = first; st != NULL; st = st->next)
    {
    i--;
    Mas[i] = st;
    Mas[i]->n=0;
    Mas[i]->c=i;
    }
    for(i=0, k=0; i<n; i++)
    for(j=i+1; j<n; j++, k++)
    {
    Spis[k].flag = 0;
    Spis[k].a = i;
    Spis[k].b = j;
    Spis[k].l = abs(Mas[i]->x-Mas[j]->x)+abs(Mas[i]->y-Mas[j]->y);
    }
    }



    int cmp_rebra(const void* r1, const void* r2)
    {
    const rebro *reb1 = (const rebro*)r1;
    const rebro *reb2 = (const rebro*)r2;
    return reb1->l-reb2->l;
    }

    int CALLBACK MyDlgProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp)
    {
    int iL,i,j,kurposX,kurposY,nev,sr,t,f;
    char buf[100];
    int otver=0,otnever=0;

    HDC hdc;
    HPEN hpen,old_pen;
    HBRUSH hbrush,old_brush;
    PAINTSTRUCT ps;

    static POINT points[MAXPOINTS];
    static int iCount;

    switch(msg)                          
    {
    case WM_INITDIALOG:break;    
    case WM_COMMAND:               
    switch(LOWORD(wp))
    {
    case IDC_LIST1:
    {
    if(HIWORD(wp) != LBN_DBLCLK)
    break;
    int i = SendMessage((HWND)lp, LB_GETCURSEL, 0, 0);
    if(i == LB_ERR)
    break;
    rebro *r = (rebro*)SendMessage((HWND)lp, LB_GETITEMDATA, i, 0);
    if(kolreb==n-1)
    {
    MessageBox(hwnd,"вы уже ввели нужное кол-во рёбер..нажмите на кнопку конец алгоритма","Ошибка",MB_OK);//вы уже ввели нужное кол-во рёбер
    key1=1;
    break;
    }
    if(r->flag != 0)
    {
    MessageBox(hwnd,"вы уже выбирали это ребро","Ошибка",MB_OK);//уже выбиралось
    key1=1;
    break;
    }
    if(Mas[r->a]->c == Mas[r->b]->c)
    {
    MessageBox(hwnd,"данное ребро образует цикл","Ошибка",MB_OK);//образует цикл
    key1=1;
    break;
    }
    if(Mas[r->a]->n==step || Mas[r->b]->n==step)
    {
    MessageBox(hwnd,"привышение степени вершины","Ошибка",MB_OK);//превышает степень
    key1=1;
    break;
    }
    if(r->l!=curr_rebro->l)
    {
    MessageBox(hwnd,"вы выбрали не то ребро","Ошибка",MB_OK);//ошибка,не то ребро
    key1=1;
    break;
    }
    r->flag = 1;
    sprintf(buf," %d ",r->a+1);
    SendMessage(GetDlgItem(hwnd,IDC_EDIT1),EM_REPLACESEL,0,(LPARAM)buf);
    sprintf(buf," -%d  ",r->b+1);
    SendMessage(GetDlgItem(hwnd,IDC_EDIT1),EM_REPLACESEL,0,(LPARAM)buf);
    sprintf(buf,"%6d ",r->l);
    SendMessage(GetDlgItem(hwnd,IDC_EDIT3),EM_REPLACESEL,0,(LPARAM)buf);
    ko+=r->l;
    Mas[r->a]->n++;
    Mas[r->b]->n++;
    t=Mas[r->a]->c;
    f=Mas[r->b]->c;
    for(i=0;i<n;i++)
    if(Mas[i]->c==f)Mas[i]->c=t;
    kolreb++;
    if(kolreb<n-1)
    {
    curr_rebro = r;
    do
    {
    curr_rebro++;
    }
    while( Mas[curr_rebro->a]->c==Mas[curr_rebro->b]->c ||
    Mas[curr_rebro->a]->n==step || Mas[curr_rebro->b]->n==step);
    }
    sprintf(buf,"%d",ko);
    SetWindowText (GetDlgItem(hwnd,IDC_STATIK),buf);

    InvalidateRect(hwnd, NULL, 1);
    break;
    }

    case IDCANCEL:
    return EndDialog(hwnd,IDCANCEL);

    case IDC_OK:
    {                                    
    sprintf(buf,"%d ",kolreb);
    SetWindowText (GetDlgItem(hwnd,IDC_KOLR),buf);
    if(kolreb<n-1)
    {                                            
    MessageBox(hwnd,"вы получили несвязанные компоненты","Ошибка",MB_OK);//вы уже ввели нужное кол-во рёбер
    key1=1;
    }
    if(key1==1) otnever++;
    else otver++;
    sprintf(buf,"%d ",otver);
    SetWindowText (GetDlgItem(hwnd,IDC_VERN),buf);
    sprintf(buf,"%d ",otnever);
    SetWindowText (GetDlgItem(hwnd,IDC_NEV),buf);
    break;
    if((otver+otnever)==10)MessageBox(hwnd,"Ваш результат: %d из 10","завершение",MB_OK);
    }

    case IDC_RASST:
    {
    EnableWindow(GetDlgItem(hwnd, WM_LBUTTONDOWN), 0);
    int i,j;
    HWND hList;
    spis *st, *sp;
    char rast[128];
    ko = 0;
    kolreb = 0;
    if(n>1)
    {
    masPOINT();
    qsort(Spis, n*(n-1)/2, sizeof(*Spis), cmp_rebra);
    curr_rebro = Spis;
    hList = GetDlgItem(hwnd, IDC_LIST1);
    for(int i = 0; i < n*(n-1)/2; i++)
    {
    sprintf(rast, "%d - %d -> %d", Spis[i].a+1, Spis[i].b+1, Spis[i].l);
    SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)rast);
    SendMessage(hList, LB_SETITEMDATA, i, (LPARAM)&Spis[i]);
    }
    }
    else MessageBox(hwnd,"Щёлкните на координатной сетке для ввода вершин!","Количества вершин недостаточно",MB_OK);
    break;
    }

    case IDC_CLEAR:                                                      
    AddError = true;
    RECT rect;
    rect.top=0;
    rect.left=0;
    rect.right=800;
    rect.bottom=800;
    InvalidateRect(hwnd,&rect,1);
    SendDlgItemMessage(hwnd, IDC_LIST1, LB_RESETCONTENT, 0, 0); // очищение листа со списком
    memfree();
    for(i=0;i<99;i++)
    {
    buf[i]=' ';

    }
    ko=0;
    //sprintf(buf,"%s",' ');
    SetWindowText(GetDlgItem(hwnd,IDC_EDIT1),buf);
    SetWindowText(GetDlgItem(hwnd,IDC_EDIT3),buf);
    SetWindowText(GetDlgItem(hwnd,IDC_KOLR),buf);
    SetWindowText(GetDlgItem(hwnd,IDC_STEP),buf);
    SetWindowText(GetDlgItem(hwnd,IDC_STATIK),buf);
    EnableWindow(GetDlgItem(hwnd,WM_LBUTTONDOWN ), 1);
    break;




    case IDC_STP:
    {
    int l=0;
    step++;
    l=sprintf(buf,"%d",step);
    SetWindowText(GetDlgItem(hwnd,IDC_STEP),buf);
    break;
    }

    case IDC_STM:
    {
    int l=0;
    if(step!=0) step--;
    l=sprintf(buf,"%d",step);
    SetWindowText(GetDlgItem(hwnd,IDC_STEP),buf);
    break;
    }

    default:return 0;
    }
    break;

    case WM_LBUTTONDOWN:
    {
    POINT CursorPos;
    CursorPos.x = LOWORD(lp);
    CursorPos.y = HIWORD(lp);

    if ((CursorPos.x/20<=25)&&(CursorPos.y/20<=25))
    {
    spis *st, *sp;
    st=new spis;
    st->next = first;
    first = st;
    st->x=CursorPos.x/20;
    st->y=CursorPos.y/20;
    n++;
    InvalidateRect(hwnd, NULL, 1);
    }

    }
    break;

    case WM_MOUSEMOVE :

    if ((LOWORD (lp)/20<=25)&&(HIWORD (lp)/20<=25))
    {

    sprintf(buf,"%d",LOWORD (lp)/20);
    SetWindowText (GetDlgItem(hwnd,IDC_VIVKOR), buf);
    sprintf(buf,"%d",HIWORD (lp)/20);
    SetWindowText (GetDlgItem(hwnd,IDC_VIVKOR1), buf);

    }    

    break;

    case WM_PAINT:                                                       
    {
    HPEN pen;
    hdc=BeginPaint(hwnd,&ps);
    Rectangle(hdc,0,0,510,510);
    hpen=CreatePen(PS_SOLID,1,RGB(0,0,255));
    hbrush=CreateSolidBrush(RGB(0,255,0));
    old_pen=(HPEN)SelectObject(hdc,hpen);
    old_brush=(HBRUSH)SelectObject(hdc,hbrush);
    MoveToEx(hdc,0,20,0);
    LineTo(hdc,500,20);
    MoveToEx(hdc,20,0,0);
    LineTo(hdc,20,500);
    for(i=0;i<25;i++)
    {
    MoveToEx(hdc,i*20,0,0);
    LineTo(hdc,i*20,500);
    MoveToEx(hdc,0,i*20,0);
    LineTo(hdc,500,i*20);
    }
    int i = n;
    for(spis *st = first; st != NULL; st = st->next, i--)
    {
    hbrush=CreateSolidBrush(RGB(0,190,0));
    old_brush=(HBRUSH)SelectObject(hdc,hbrush);
    kurposX = st->x;
    kurposY = st->y;
    Ellipse(hdc,(kurposX*20-5),(kurposY*20-5),(kurposX*20+5),(kurposY*20+5));
    iL=sprintf(buf,"%d", i);
    TextOut(hdc,(kurposX*20-15),(kurposY*20-35),buf,iL);
    }
    if(Spis != NULL)
    {
    for(i=0; i<n*(n-1)/2; i++)
    if(Spis[i].flag != 0)
    {
    pen=CreatePen(PS_SOLID,2,RGB(0,33,99));
    SelectObject(hdc,pen);
    MoveToEx(hdc,Mas[Spis[i].a]->x*20,Mas[Spis[i].a]->y*20,0);
    LineTo(hdc,Mas[Spis[i].b]->x*20,Mas[Spis[i].b]->y*20);
    }
    }

    EndPaint(hwnd,&ps);
    DeleteObject(hpen);
    DeleteObject(hbrush);
    DeleteObject(pen);
    }
    break;
    default:return 0;                                                                            
    }
    return 1;                                                                                                    
    }

    void main()

    {
    DialogBox(0,MAKEINTRESOURCE(IDD_DIALOG1),0,MyDlgProc);

    _CrtDumpMemoryLeaks();
    }
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    А чему у тебя равно значение глобальной переменной n в функции masPOINT ?
    В эту переменную запись осуществляется всего один раз, и то это в функции memfree и записывается туда 0.
     
Загрузка...
Похожие Темы - Необработанное Исключение 0x00412b4a
  1. LexL
    Ответов:
    2
    Просмотров:
    1.455
  2. Murtas
    Ответов:
    2
    Просмотров:
    2.685
Статус темы:
Закрыта.

Поделиться этой страницей