C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[313] [질문] [BCB] EAccess Vi~ 에 관한 질문/프포
만해 [ ] 5505 읽음    1998-05-06 10:34
안녕하세요 자칭 석두 만해 입니다.

제가 학생이라서요 리포트가 많거든요

시스템 프로그램 이란 과목을 수강하는데요

교수가 SIC Assemler란걸 만들어 오라고 하네요

이번주 금욜이 마감인데요

제가 조금 짜고 있는데

근데 웬일

함수 중간에 sprintf()문을 쓰니깐 에러가 나네요
어떻게 해야 할지

함수 전문을 밑에 옮기겠습니다.

보시고 좀 갈켜 주세요

void __fastcall TMainForm::AsmBtnClick(TObject *Sender)
{
   try
     {
        if ( SourceEditor->Lines->Count > 0)
      {
         SymTable->hash_clear();
   AssemblyForm->Show();
   AssemblyForm->RunAssemble();
         }
     else
      ShowMessage ("먼저 소스를 입력 하세요");
        }
    catch(.../*::EAccessViolation*/)
     {
        ShowMessage("ERROR");
        }
/* pass1();
pass2();*/
}
여기서 ASmbtn을 누르면 AssemblyForm이 뜨고요

그 AssemblyForm의 내부에 있는 RunAssemble가 실행 됩니다.

그리고 RunAssemble 내부는 이렇습니다.
void __fastcall TAssemblyForm::RunAssemble()
{
  pass1();
        Label3->Caption += "Passing";
     pass2();
  Label3->Caption += "Completed";
        Label4->Caption += "Passsing";
     Label2 -> Caption = "Assembly Completed ";
     Button1->Caption = "&Ok";
}

여기서 가장 먼저 실행 되는것은 pass1()이지요
pass2()는 아직 소스가 안들어 간것이라서 별 상관이 없을듯~

pass1()소스는 아래와 같습니다.
void __fastcall TAssemblyForm::pass1()
{
try
{
int i,j,l,define[4]={{NULL,}};
int LOCCTR = 0;
int error = 0;
int start_address=0;
int program_length=0;
int temp;
Boolean process=false;
char *ch;

AnsiString TEMP;
AnsiString Inter;
AnsiString HEXA;
AnsiString ERRTEMP;

TEMP = MainForm->SourceEditor->Lines->Strings[0].UpperCase();
l = MainForm->Process->divide_token(TEMP.c_str());

for ( j = 0 ; j < l ; j++ )
    define[j] = MainForm->Process->define_token(MainForm->Process->word[j],j);

if ( !( strcmp(MainForm->Process->word[1],"START") ) && ( define[1] != ioperator
) )
{
    if ( MainForm->Process->word[2][0] != NULL )
     MainForm->Process->htoi(MainForm->Process->word[2],&LOCCTR);
//    IntToHex(LOCCTR,temp);
//    if (sprintf(Inter.c_str(), "%-10d %-s",temp,MainForm->SourceEditor->Lines-
>Strings[0].c_str()) == EOF)
//     ShowMessage("Error");
// sprintf(ch, "%-10d %-s",temp,MainForm->SourceEditor->Lines->Strings[0].c_str
());
// MainForm->ItmEdit->Lines->Add (Inter );
// MainForm->ItmEdit->Lines->Add (ch);
    }
else
    LOCCTR = 00;


    start_address = LOCCTR;

    for ( i = 1 ; i < MainForm->SourceEditor->Lines->Count ::
          MainForm->Process->word[1] == "END" ; ++i )
     {
        TEMP = MainForm->SourceEditor->Lines->Strings[i].UpperCase(); //
        l = MainForm->Process->divide_token(TEMP.c_str());            //  한 라
인을 읽어 들이는 부분

        for ( j = 0 ; j < l ; j ++ )
         {
            if ( MainForm->Process->word[0] != "'" )
            // 주석문이 아니면
             {
                if ( MainForm->Process->define_token(MainForm->Process->word[j],
j) == isymbol )
                    // 심볼을 찾았으면
              {
                 int s=j;
                    process = true;
                  if ( MainForm->SymTable->hash_search(MainForm->Process->word[j
]) )
       //  심볼이 이미 심볼 테이블에 있으면
                      {
                         error++;
                         ErrNumber->Caption = error;
          ERRTEMP = i+1;
                         ERRTEMP +=  "  번째 라인에서 ";
                      ERRTEMP += MainForm->Process->word[s];
                         ERRTEMP += " 이/가 두번이상 사용되었습니다";
                         MainForm->ErrorWindow->Lines->Add(ERRTEMP);
                         ERRTEMP = "";
                         }
                      else
                         MainForm->SymTable->hash_insert(MainForm->Process->word
[j]);
                            // 심볼이 심볼테이블에 없으면
                 }
    if ( MainForm->Process->define_token(MainForm->Process->word[j],j) == iopera
tor )
                    // opcode를 찾는 구문
                    {LOCCTR += 3;process = true;}
                else if ( !strcmp(MainForm->Process->word[j],"WORD") ) //WORD이

                 {LOCCTR += 3;process = true;} // LOCCTR에 3을 증가

             else if ( !strcmp(MainForm->Process->word[j],"RESW" ))
                 {LOCCTR += 3 * atoi(MainForm->Process->word[j+1]);process = tru
e;}

                else if ( !strcmp(MainForm->Process->word[j],"RESB" ))
                 {LOCCTR += atoi(MainForm->Process->word[j+1] - '0');process = t
rue;}

             else if ( !strcmp(MainForm->Process->word[j],"BYTE" ) )            
      //
                {                                                               
     //
                if ( ( MainForm->Process->word[j+1] == "C" ) &&                 
      //
                  ( strlen(MainForm->Process->word[j+2]) < 32) )                
  //
                  {LOCCTR += strlen(MainForm->Process->word[j+2]) ;process = tru
e;} //
                                                                                
         //
                else if ( (MainForm->Process->word[j+1] == "X") )/* &&          
      //
//                      ( !(strlen(MainForm->Process->word[j+2])/2 )/* &&       
     //
                        ( ( strlen(MainForm->Process->word[j+2]) < 32 )  ))*/   
         //
                                   }// for ( j = 0 ; j < l ; j ++ )

  } //END가 될  까지 읽어들이는 부분

        MainForm->ItmEdit->Lines->Add (MainForm->SourceEditor->Lines->Strings[Ma
inForm->SourceEditor->Lines->Count]);
        // 마지막 라인을 Intermediate File에 한 라인 입력

        program_length = start_address - LOCCTR;
        // 프로그램 길이를 연산
}
catch(...)
{
    ShowMessage ("Error Created");
    }

여기에서 pass1()이 끝납니다. 근데 이거 너무 긴거 아닌가?

이 소스에서 문제점이 뭐냐면요

pass1()에 sprintf()문장이 한번이라도 들어가면 EAccess V뭐라고하는 에러가 뜬다니
에러가 발생됩니다.

런타임 에러지요
그리고 만약 pass1()에서 sprintf()문장이 하나도 없으면 그 에러가 안뜹니다.

그리고 그 에러가 뜨는 시점은 제가 Tracert한 결과

AsmBtnClick()의 가장 마지막 그러니깐 함수 호출이 끝나고

} <- AsmBtnClick()함수가 메모리에서 삭제 될때 (말이 맞을려나?)

그때 EAccess Vi`~~~ 라고 하는 에러가 뜨네요

지금의 저로서는 도저히~ 에러 원인을 모르돃습니다.

여러분들께서 조금만 도와 주세요

이거만 내면 최소 B+이상 받는다는 선배님들의 말씀에 이것만 자꾸 하는데

예상외의 에러에 의해 요번주 내에 내기 힘들게 되고 있습니다.

제발좀 도와 주세요~



+ -

관련 글 리스트
313 [질문] [BCB] EAccess Vi~ 에 관한 질문/프포 만해 5505 1998/05/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.