2011-08-21 10 views
-1

Visual Studio 6.0에서 프로그램을 작성합니다. 그래픽 사용자 인터페이스입니다. GUI 용 MFC 클래스를 사용하여 책 레코드를 저장합니다. 해당 programe 난 레코드를 보려고하는 동안 처리되지 않은 예외 액세스 위반 오류가 있어요. 파일을 처리하는 CFile 클래스를 사용하여 레코드를 파일에 저장합니다. 오류 메시지 상자에서 OK 단추를 누르면 OUTPUT.C로 파일 이름을 묻는 탐색 상자로 이동하지만 파일의 종류를 찾을 수 없으며이 찾아보기 상자에서 취소 단추를 누르면 필자에게로 이동합니다. 이 줄에 화살표를 가리키는 디스 어셈블리 파일 1021674C movsx edx,byte ptr [ecx]. 나는 너의 도움을 원한다.이게 내 마지막 임무 야. 나는 내일 아침에 그것을 제출해야한다. 나를 도와주세요. 나는 문제가 올바르게 기술되어서 사람들이 올바르게 이해할 수 있기를 바랍니다. 프로그램 자체의 코드는 다음과 같습니다 :처리되지 않은 예외 MSVCRTD.DLL

#include "afxwin.h" 
#include "resource.h" 

struct books 
{ 
    char bookname[25]; 
    char authorname[40]; 
    float price; 
    int copies; 
    unsigned int ispn; 
    int page; 
    char issue_date[15]; 
    char avail[10]; 

}; 

CFile fp("book.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite); 
CString b_name; 
unsigned int b_ispn; 

class about_dialog:public CDialog 
{ 
public: 
    about_dialog():CDialog(IDD_DIALOG1) 
    { 
    } 

}; 

class add_dialog:public CDialog 
{ 
private: 
    struct books b; 
    CString s[4]; 
    public: 

     add_dialog():CDialog(IDD_DIALOG2) 
     { 
      b.price =0.0; 
      b.copies = b.page = 0; 
      b.ispn = 0 ; 

     } 

     void DoDataExchange(CDataExchange *p) 
     { 
      DDX_Text(p,IDC_EDIT1,s[0]);//name 
      DDX_Text(p,IDC_EDIT2,s[1]);//author 
      DDX_Text(p,IDC_EDIT3,b.copies);//copies 
      DDX_Text(p,IDC_EDIT4,b.ispn);//ispn 
      DDX_Text(p,IDC_EDIT5,b.price);//price 
      DDX_Text(p,IDC_EDIT6,b.page);//pages 

      DDX_Text(p,IDC_COMBO5,s[2]);//issu date 
      DDX_Text(p,IDC_COMBO6,s[3]);//availabel 

     } 
     void save() 
     { 
      CDialog::OnOK(); 

      strcpy(b.bookname,s[0]); 
      strcpy(b.authorname,s[1]); 
      strcpy(b.issue_date,s[2]); 
      strcpy(b.avail,s[3]); 


      fp.SeekToEnd(); 
      fp.Write(&b,sizeof(b)); 
     } 

     DECLARE_MESSAGE_MAP() 
}; 

BEGIN_MESSAGE_MAP(add_dialog,CDialog) 
ON_COMMAND(IDSAVE,save) 
END_MESSAGE_MAP() 

class getbook_dialog:public CDialog 
{ 
public: 

    struct books b; 
    getbook_dialog():CDialog(IDD_DIALOG3) 
    { 
     b_name=""; 
     b_ispn=0; 
    } 

    void DoDataExchange(CDataExchange *p) 
    { 

     DDX_Text(p,IDC_EDIT1,b_ispn); 
     DDX_Text(p,IDC_EDIT2,b_name); 
    } 

}; 

class modify_dialog:public CDialog 
{ 
private: 
    CString s[4]; 
    struct books b; 

    public: 

     modify_dialog(struct books bb):CDialog(IDD_DIALOG2) 
     { 
      b=bb; 
      s[0]=bb.bookname; 
      s[1]=bb.authorname; 
      s[2]=bb.issue_date; 
      s[3]=bb.avail; 


     } 


    void DoDataExchange(CDataExchange *p) 
     { 
      DDX_Text(p,IDC_EDIT1,s[0]);//name 
      DDX_Text(p,IDC_EDIT2,s[1]);//author 
      DDX_Text(p,IDC_EDIT3,b.copies);//copies 
      DDX_Text(p,IDC_EDIT4,b.ispn);//ispn 
      DDX_Text(p,IDC_EDIT5,b.price);//price 
      DDX_Text(p,IDC_EDIT6,b.page);//pages 
      DDX_Text(p,IDC_COMBO5,s[2]);//issu date 
      DDX_Text(p,IDC_COMBO6,s[3]);//availabel 

     } 
     void save() 
     { 
      CDialog::OnOK(); 

      strcpy(b.bookname,s[0]); 
      strcpy(b.authorname,s[1]); 
      strcpy(b.issue_date,s[2]); 
      strcpy(b.avail,s[3]); 

      fp.Seek(-(long)sizeof(b),CFile::current); 
      fp.Write(&b,sizeof(b)); 

     } 

     DECLARE_MESSAGE_MAP() 
}; 
BEGIN_MESSAGE_MAP(modify_dialog,CDialog) 
ON_COMMAND(IDSAVE,save) 
END_MESSAGE_MAP() 

class myframe: public CFrameWnd 
{ 
public: 

    myframe() 
    { 
     CString mywindowclass; 
     CBrush mybrush; 
     mybrush.CreateSolidBrush(RGB(255,255,255)); 

     mywindowclass = AfxRegisterWndClass(CS_HREDRAW |CS_VREDRAW,AfxGetApp()->LoadStandardCursor(IDC_ARROW),mybrush,AfxGetApp()->LoadIcon(IDI_ICON1)); 

     Create(mywindowclass,"DATABASE",WS_OVERLAPPEDWINDOW,rectDefault,0,MAKEINTRESOURCE(IDR_MENU1)); 

    } 

    void about() 
    { 
     about_dialog diag; 
     diag.DoModal(); 
    } 

    void addrec() 
    { 
     Invalidate(); 
     add_dialog diag; 
     diag.DoModal(); 
    } 

    void byname() 
    { 
     struct books b; 

     CClientDC d(this); 
     CRect r; 
     int y; 
     char str[90]; 
     fp.SeekToBegin(); 
     y=0; 
     GetClientRect(&r); 
     CBrush mybrush(RGB(255,255,255)); 
     d.FillRect(&r,&mybrush); 

     while(fp.Read(&b,sizeof(b))>=sizeof(b)) 
     { 
      sprintf(str,"%-25s %-40s",b.bookname,b.copies); 
      d.TextOut(0,y,str,strlen(str)); 

      y+=15; 
     } 
    } 

    void author() 
    { 
     struct books b; 

     CClientDC d(this); 
     int y; 
     char str[90]; 
     CRect r; 

     GetClientRect(&r); 
     CBrush mybrush(RGB(255,255,255)); 
     d.FillRect(&r,&mybrush); 

     fp.SeekToBegin(); 
     y=0; 

     while(fp.Read(&b,sizeof(b))>=sizeof(b)) 
     { 
      sprintf(str,"%-25s %-20s %-6u %-10s",b.bookname,b.authorname,b.page,b.copies); 
      d.TextOut(0,y,str,strlen(str)); 
      y+=15; 
     } 
    } 

    void ispn() 
    { 
     struct books b; 
     CClientDC d(this); 
     int y; 
     char str[90]; 
     CRect r; 
     GetClientRect(&r); 
     CBrush mybrush (RGB(255,255,255)); 
     d.FillRect(&r,&mybrush); 

     fp.SeekToBegin(); 
     y=0; 

     while(fp.Read(&b,sizeof(b))>=sizeof(b)) 
     { 
      sprintf(str,"%-25s %-20s %-15s %-15s",b.bookname,b.authorname,b.ispn,b.avail); 
     // d.TextOut(0,y,str,strlen(str)); 
      y+=15; 
     } 
    } 


    void modifyrec() 
    { 
     Invalidate(); 

     bool found; 

     struct books b; 

     getbook_dialog diag; 
     if(diag.DoModal()==IDOK) 
     { 
      found = false; 

      fp.SeekToBegin(); 

      while(fp.Read(&b,sizeof(b))>=sizeof(b)) 
      { 
       if(b.ispn == b_ispn && strcmp(b.bookname,b_name)==0) 
       { 
        found = true; 
        break; 
       } 
      } 

      if(found == true) 
      { 
       modify_dialog mdiag(b); 
       mdiag.DoModal(); 
      } 
      else 
       MessageBox("Record Not Found","Modify Record...."); 
     } 
    } 

    void delrec() 
    { 
     bool found; 
     struct books b; 

     Invalidate(); 

     getbook_dialog diag; 
     if(diag.DoModal()==IDOK) 
     { 
      found = false; 
      fp.SeekToBegin(); 

      CFile ft("temp.dat",CFile::modeCreate | CFile::modeWrite); 
      while(fp.Read(&b,sizeof(b))>= sizeof(b)) 
      { 
       if(b.ispn==b_ispn && strcmp(b.bookname,b_name)==0) 
       { 
        found = true; 
       } 
       else 
        ft.Write(&b,sizeof(b)); 

      } 

      if(found == false) 
        MessageBox("Record Not Found","Delete Record...."); 

      fp.Close(); 
      ft.Close(); 

      CFile::Remove("book.txt"); 
      CFile::Rename("temp.dat","book.txt"); 
      fp.Open("book.txt",CFile::modeCreate |CFile::modeNoTruncate |CFile::modeReadWrite); 
     } 
    } 

    DECLARE_MESSAGE_MAP() 
}; 
BEGIN_MESSAGE_MAP(myframe,CFrameWnd) 

ON_COMMAND(101,about) 
ON_COMMAND(201,addrec) 
ON_COMMAND(301,byname) 
ON_COMMAND(302,author) 
ON_COMMAND(303,ispn) 
ON_COMMAND(401,modifyrec) 
ON_COMMAND(501,delrec) 

END_MESSAGE_MAP() 


class myapp:public CWinApp 
{ 
    public: 

     int InitInstance() 
     { 
      myframe *fr; 
      fr = new myframe; 
      fr->ShowWindow(SW_SHOWMAXIMIZED); 
      m_pMainWnd = fr; 

      return 1; 
     } 
}; 
myapp app; 
+1

프로그램이 표준 라이브러리의 내부에서 충돌하는 경우 Winows는 충돌이 발생한 파일이 output.c라는 것을 알고 있지만 파일이 어디에 있는지 묻지 않습니다. 하지만 그건 중요하지 않습니다. 그런 것처럼 취소를 누른 다음 프로그램이 충돌 한 곳을 보여주는 ** 스택 추적 ** 또는 ** 호출 스택 **을 찾습니다. 스택 추적을하면 라이브러리 코드에서 다시 코드로 이동하게됩니다. 그러면 충돌이 어디서 왜 발생하는지 더 잘 알 수 있습니다. 이 충돌이 일어나는 코드에서 누군가가 당신을 도울 기회를 가질 수있는 행을 찾을 수 있다면. – john

+0

this \t 0x002f1940 {myframe hWnd = 0x000b0684} 도움이된다면이 줄을보십시오 – sam

+0

아무 도움이되지 않습니다. 호출 스택을 올라가 코드의 어딘가에서 찾아야합니다. 적어도 충돌이 발생한 코드에서 줄 번호가 필요합니다. 하지만 가장 좋은 기회는 직접 디버거를 사용하는 법을 배우는 것입니다. 인터넷을 통해 디버깅 세션을 수행하는 것은 어렵습니다. – john

답변

0

액세스 위반 당신이 NULL 포인터를 사용하는 것을 의미한다. 예를 들어

:

class A 
{ 
public: 
    int num; 
}; 

int main() 
{ 
    A *pa = NULL; 
    cout << pa->num << endl; // <----------------access violation 

    return 0; 
} 

난 당신이 호출 스택을보고 제안하고 NULL 포인터가 어디에 있는지 찾을 수 있습니다.

관련 문제