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

C/C++ Q/A
[6646] Re:C++ 코딩질문이요!
Lyn [tohnokanna] 12875 읽음    2011-12-04 01:42
숙제는 직접 ...

syd9879 님이 쓰신 글 :
: 1. 결과화면이 제가 원하는대로 안나오는데..
: 첨부파일 참조해주세요 ..
: 첨부 1 에서는 빨간색으로 표시한 부분에 43이라고 떠야되는데 안뜹니다.
: 첨부 2 에서는 중간중간에 한줄 씩 빈 라인이 있는데 없애고 싶습니다.
:
: 이 문제를 해결하려면 소스코드를 어떻게 고쳐야 되는지 알고 싶습니다.
:
: 2.FreeFormatFile 을 수정한다면
: .과 빈라인 처리를 어떻게 해야되는지 알고 싶습니다.
:
: 3.Symtab 도 file로 저장을 하고 싶은데 어떻게 해야되나요?
:
:
: 위 세가지 사항에 대해 구체적으로 알려주세요 ㅜㅜ
:
: 어떤 코드를 어디에 추가해야하는지, 어떤 코드를 고쳐야하는지 알려주세요!
:
: 고수님들 부탁드립니다!
:
:

:
: main.c  코드 입니다.
:
: #include <stdio.h>
: #include <stdlib.h>
: #include <string.h>
: #define TRUE 1
: #define FALSE 0
: #define LINE_LENGTH 100 // 파일한줄의 최대치설정
:
: struct SYM_REFERENCE {
:  int symref_position; // 참조 위치변수
:  struct SYM_REFERENCE *sp_nsymref;
: };
:
: struct SYM_TABLE {
:  int symbolLineNumber; // SYMBOL 의 위치의 행
:  char c_sbname[8]; // 현재SYMBOL의위치
:  int confirmAdded; // SYM_TABLE이 addsymref() 함수에서추가되었는지 boolean으로 확인
:  struct SYM_REFERENCE *sp_fsymref; // first referencelist - current SYMBOL
:  struct SYM_REFERENCE *sp_lsymref; // end referencelist - current SYMBOL
:  struct SYM_TABLE *sp_nsymbol; // next sym_table address
: };
:
:
: struct SYM_TABLE *sp_fsymbol;
:
: int addsymbol(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow);
: int addsymref(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow);
: void symbol_intlz(struct SYM_TABLE *sp_isymtab);
: void symref_intlz(struct SYM_REFERENCE *sp_isymtab);
: struct SYM_TABLE *f_operand_rm(struct SYM_TABLE *sp_fsymtab);
:
: int addsymref(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow)
: {
:  struct SYM_TABLE *sp_csymtab = sp_fsymtab; // 현재SYM_TABLE의주소값
:  do
:  {
:   if(strcmp(sp_csymtab->c_sbname,cp_symname) == FALSE)
:   {
:   if(sp_csymtab->sp_fsymref != NULL) // 이미레퍼런스된SYM_REFERENCE 테이블이있을때
:   {
:     sp_csymtab->sp_lsymref->sp_nsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE));
:     sp_csymtab->sp_lsymref = sp_csymtab->sp_lsymref->sp_nsymref;
:     symref_intlz(sp_csymtab->sp_lsymref);
:     sp_csymtab->sp_lsymref->symref_position = i_crow;
:     break;
:   }
:   else // 이미레퍼런스된SYMREF 테이블이없을때
:   {
:     sp_csymtab->sp_fsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE));
:     sp_csymtab->sp_lsymref = sp_csymtab->sp_fsymref;
:     symref_intlz(sp_csymtab->sp_lsymref);
:     sp_csymtab->sp_lsymref->symref_position = i_crow;
:     break;
:   }
:   }
:   else if(sp_csymtab->sp_nsymbol == NULL) // 마지막까지SYM_TABLE을찾았으나OPEREND 참조와맞는SYM_TABLE이없을때
:   {
:   sp_csymtab->sp_nsymbol = (struct SYM_TABLE *) malloc(sizeof(struct SYM_TABLE));
:   sp_csymtab = sp_csymtab->sp_nsymbol;
:   symbol_intlz(sp_csymtab); // 구조체초기화
:   strcpy(sp_csymtab->c_sbname , cp_symname);
:   sp_csymtab->confirmAdded = TRUE;

:   sp_csymtab->sp_fsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE));
:   sp_csymtab->sp_lsymref = sp_csymtab->sp_fsymref;
:   symref_intlz(sp_csymtab->sp_lsymref);
:   sp_csymtab->sp_lsymref->symref_position = i_crow;
:   break;
:   }
:   else sp_csymtab = sp_csymtab->sp_nsymbol;
:  }while(TRUE); // SYM_TABLE의마지막까지같은SYMBOL을찾는다.

:  return 0;
: }
:
:
: int addsymbol(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow)
: {
:  struct SYM_TABLE *sp_csymtab = sp_fsymtab; // address value
:  if(strcmp(sp_csymtab->c_sbname,"NOINTLZ") == FALSE)  //strcmp 같으면0 다르면그외값
:  {
:   strcpy(sp_csymtab->c_sbname, cp_symname);
:   sp_csymtab->symbolLineNumber = i_crow;
:   return 0;
:  }
:  do
:  {
:   if(strcmp(sp_csymtab->c_sbname,cp_symname) == FALSE)
:   {
:   if(sp_csymtab->confirmAdded == TRUE)
:   {
:     sp_csymtab->confirmAdded = FALSE;
:     sp_csymtab->symbolLineNumber = i_crow;
:     break;
:   }
:   else
:   {
:     printf("      %s  %15d , %d\n",cp_symname,sp_csymtab->symbolLineNumber, i_crow);
:     return 0;
:   }
:   }
:   else if(sp_csymtab->sp_nsymbol == NULL)
:   {
:   sp_csymtab->sp_nsymbol = (struct SYM_TABLE *) malloc(sizeof(struct SYM_TABLE));
:   sp_csymtab = sp_csymtab->sp_nsymbol;
:   symbol_intlz(sp_csymtab); // 구조체초기화
:   strcpy(sp_csymtab->c_sbname , cp_symname);
:   sp_csymtab->symbolLineNumber = i_crow;
:   break;
:   }
:   else sp_csymtab = sp_csymtab->sp_nsymbol;
:  }while(TRUE); // SYM_TABLE의마지막까지같은SYMBOL을찾는다.

:  return 0;
: }
:
: void symref_intlz(struct SYM_REFERENCE *sp_isymtab)
: {
:  sp_isymtab->symref_position = 0;
:  sp_isymtab->sp_nsymref = NULL; // sp_nsymref
: }
:
:
: void symbol_intlz(struct SYM_TABLE *sp_isymtab)
: {
:  strcpy(sp_isymtab->c_sbname , "NOINTLZ");
:  sp_isymtab->symbolLineNumber = 0;
:  sp_isymtab->confirmAdded = FALSE;
:  sp_isymtab->sp_fsymref = NULL;
:  sp_isymtab->sp_lsymref = NULL;
:  sp_isymtab->sp_nsymbol = NULL;
: }
:
: struct SYM_TABLE *f_operand_rm(struct SYM_TABLE *sp_fsymtab)
: {
:  struct SYM_TABLE *sp_tmpsymtab;
:  struct SYM_TABLE *sp_csymtab = sp_fsymtab;

:  while(TRUE)
:  {
:   if(sp_csymtab->sp_nsymbol != NULL)
:   {
:   if(sp_csymtab->confirmAdded == TRUE)
:   {
:     sp_tmpsymtab = sp_csymtab;
:     sp_csymtab = sp_csymtab->sp_nsymbol;
:     sp_fsymtab = sp_csymtab;
:     free(sp_tmpsymtab);
:   }

:   else if(sp_csymtab->sp_nsymbol->confirmAdded == TRUE)
:   {
:     if(sp_csymtab->sp_nsymbol->sp_nsymbol == NULL)
:     {
:     free(sp_csymtab->sp_nsymbol);
:     sp_csymtab->sp_nsymbol = NULL;
:     break;
:     }
:     else
:     {
:     sp_tmpsymtab = sp_csymtab->sp_nsymbol;
:     sp_csymtab->sp_nsymbol = sp_csymtab->sp_nsymbol->sp_nsymbol;
:     free(sp_tmpsymtab);
:     }
:   }
:   else sp_csymtab = sp_csymtab->sp_nsymbol;  
:   }
:   else
:   break;

:  }
:  return sp_fsymtab;

: }
:

:
: //int _tmain(int argc, _TCHAR* argv[])
: int main()
: {
:  FILE *fp, *fp_src, *fp_list, *fp_out; // 소스파일과행번호파일, 출력파일의FILE 구조체포인터
:  struct SYM_TABLE *sp_fsymtab = (struct SYM_TABLE *) malloc(sizeof(struct SYM_TABLE));
:  struct SYM_TABLE *sp_csymtab;
:  struct SYM_REFERENCE *sp_csymref;

:  char *cp_src;
:  char buf;
:  char *file_name  = "fixedfile";
:  char c_src[LINE_LENGTH];
:  int i_crow = 1; // 현재행
:  symbol_intlz(sp_fsymtab);

:  printf(" -----------------------------------------\n");
:  printf("|Duplicated symbol          location      |\n");
:  printf(" -----------------------------------------\n");


:  if ((fp_src = fopen("freefile","r")) == NULL)
:   return -1;
:  if((fp_out = fopen("tempfile","w")) == NULL)
:  {
:   fclose(fp_src);
:   return -1;
:  }

:  if((fp_list = fopen("fixedfile","w")) == NULL)
:  {
:   fclose(fp_src);
:   fclose(fp_out);
:   return -1;
:  }

:  while(fgets(c_src, LINE_LENGTH - 1, fp_src))
:  {
:   switch(c_src[0])
:   {
:   case '.':  // . 뒤의문장은모두주석이기때문에그행을정렬없이파일에저장하고반복의처음으로간다.
:   fprintf(fp_out,"%s",c_src);
:   continue;
:   case '\r':  // \r(carriage return)가c_src[0]에있을시예외발생하기때문에반복의처음으로간다.
:   continue;
:   case ' ':
:   default :
:   break;
:   }
:   fprintf(fp_list,"  %04d ", i_crow); //행번호출력
:   if(c_src[0] != ' ')
:   {
:   cp_src = strtok(c_src, " \r");
:   addsymbol(cp_src, sp_fsymtab, i_crow);
:   fprintf(fp_out,"%-8s ", cp_src);
:   fprintf(fp_list,"%-8s ", cp_src);
:   cp_src = strtok(NULL, " \r");
:   fprintf(fp_out,"%-6s  ", cp_src);
:   fprintf(fp_list,"%-6s  ", cp_src);
:   cp_src = strtok(NULL, " \r");
:   addsymref(cp_src, sp_fsymtab, i_crow);
:   fprintf(fp_out,"%s", cp_src);
:   fprintf(fp_out,"\n");          // 따라서세번쨰strtok 실행후뒷부분은주석이므로그것을제외하고\n(한줄내림)escape 문자를넣어준다.
:   fprintf(fp_list,"%s", cp_src);
:   fprintf(fp_list,"\n");
:   }
:   else
:   {
:   fprintf(fp_out,"        ");
:   fprintf(fp_list,"        ");
:   cp_src = strtok(c_src, " \r");
:   fprintf(fp_out,"%-6s  ", cp_src);
:   fprintf(fp_list,"%-6s  ", cp_src);
:   cp_src = strtok(NULL, " \r");
:   fprintf(fp_out,"%s", cp_src);
:   fprintf(fp_list,"%s", cp_src);
:   addsymref(cp_src, sp_fsymtab, i_crow);
:   fprintf(fp_out,"\n");
:   fprintf(fp_list,"\n");
:   }

:   i_crow++;
:  }


:  sp_fsymtab = f_operand_rm(sp_fsymtab);
:  sp_csymtab = sp_fsymtab;


:  printf("\n\n -----------------------------------------\n");
:  printf("|Symbol        Defined        Used      |\n");
:  printf(" -----------------------------------------\n");
:  do
:  {
:   if((sp_csymtab->symbolLineNumber == 1) || (sp_csymtab->symbolLineNumber == 2))
:   {
:   if(sp_csymtab->sp_nsymbol == NULL)
:     break;
:   sp_csymtab = sp_csymtab->sp_nsymbol;
:   continue;
:   }
:   printf(" %-15s%-15d",sp_csymtab->c_sbname, sp_csymtab->symbolLineNumber);
:   sp_csymref = sp_csymtab->sp_fsymref;
:   if(sp_csymtab->sp_fsymref != NULL)
:   {

:   while(TRUE)
:   {
:     printf("%d",sp_csymref->symref_position);
:   
:     if(sp_csymref->sp_nsymref == NULL)
:     {
:     printf("\n");
:     break;
:     }
:     else
:     {
:     printf(", ");
:     sp_csymref = sp_csymref->sp_nsymref;
:     }
:   }
:   }
:   else
:   printf("NOT\n");
:   if(sp_csymtab->sp_nsymbol == NULL)
:   break;
:   else
:   sp_csymtab = sp_csymtab->sp_nsymbol;



:  }while(TRUE);

:  fclose(fp_src);
:  fclose(fp_out);
:  fclose(fp_list);
:
:  getchar();
:  printf("\n\n ---------------------------------\n");
:  printf("|  plus line fixed source file  |\n");
:  printf(" ---------------------------------\n");
:
:  fp = fopen(file_name, "r"); //파일 열기
:  if(fp == NULL) // 파일 열기 성공여부 판단.
:  {
:   printf("%s 파일을 열지 못했습니다.\n", file_name);
:   exit(1);
:  }
:  while( (buf=getc(fp)) != EOF ) // getc() 함수를 이용하여 한 문자씩 읽어온다.  != EOF : 파일의 끝이 아니냐?
:  {
:   putchar(buf); // 콘솔창에 1문자씩 출력한다.
:  }
:  fclose(fp); // 파일을 닫는다.

:  return 0;
: }
:

:

:
: FreeFormatFile 수정본입니다.
:
:
: test start 1000 test program for sic software
: first stl retadr save return address
: cloop    jsub    rdrec            read input record
: lda length test for eof (length = 0
: comp one plus eol or eof)
: jeq endfil exit if eof found
:         jsub    wrrec            write output record
: j cloop loop
: endfil  lda    eof              insert end of file marker
:         sta    buffer
:         lda    three            set length = 3
:                   sta    length
:         jsub    wrrec            write eof
:         ldl    retadr            get return address
: rsub return to caller
: eof      byte    c'eof'
: three    word    3
: zero    word    0
: one            word    1
: five    word    5      
: retadr  resw    1
: length  resw            1
: buffer  resb    4096              4096-byte buffer area
: .






: maxlen  word    2048

: .      subroutine to read record into buffer
: .
: rdrec ldx zero clear loop counter
: lda zero clear a to zero
: rloop    td      input            test input device
:         jeq    rloop            loop until ready
: rd input read character into register a
:         comp    five              test for eol or eof
: jlt exit exit loop if found
:         stch    buffer,x          store character in buffer
: tix maxlen loop unless max length
: jlt rloop has been reached
: exit    stch    buffer,x          store eol/eof in buffer
:         stx    length            save record length
:         lda    length            modify record length to include
: add one eol or eof
:         sta    length
: rsub return to caller
: input    byte    x'f3'            code for input device
: maxlen  word    4096
: .

:
: cloop  comp  one
:

:
: .      subroutine to write record from buffer
: .
: wrrec    ldx    zero              clear loop counter
: wloop    td      output            test output device
:         jeq    wloop            loop until ready
:         ldch    buffer,x          get character from buffer
:         wd      output            write character
:         tix    length            loop until all characters
: jlt wloop have been written
: rsub return to caller
: output  byte    x'06'            code for output device
:         end    first
:
: FreeFormatFile 원본 입니다.  
:  test              start  1000              test program for sic software
: first            stl          retadr            save return address
: cloop    jsub    rdrec            read input record
:               lda            length            test for eof (length = 0
:         comp    one                plus eol or eof)
:                   jeq    endfil            exit if eof found
:         jsub    wrrec            write output record
:         j      cloop            loop
: endfil  lda    eof              insert end of file marker
:         sta    buffer
:         lda    three            set length = 3
:                   sta    length
:         jsub    wrrec            write eof
:         ldl    retadr            get return address
:         rsub                      return to caller
: eof      byte    c'eof'
: three    word    3
: zero    word    0
: one            word    1
: five    word    5
: retadr  resw    1
: length  resw            1
: buffer  resb    4096              4096-byte buffer area
: maxlen  word    2048
: rdrec    ldx    zero                      clear loop counter
:         lda    zero              clear a to zero
: rloop    td      input            test input device
:         jeq    rloop            loop until ready
:         rd                    input            read character into register a
:         comp    five              test for eol or eof
:         jlt    exit              exit loop if found
:         stch    buffer,x          store character in buffer
:                     tix    maxlen            loop unless max length
:         jlt    rloop                has been reached
: exit    stch    buffer,x          store eol/eof in buffer
:         stx    length            save record length
:         lda    length            modify record length to include
:         add    one                eol or eof
:         sta    length
:         rsub                      return to caller
: input    byte    x'f3'            code for input device
: maxlen  word    4096
: cloop  comp  one
: wrrec    ldx    zero              clear loop counter
: wloop    td      output            test output device
:         jeq    wloop            loop until ready
:         ldch    buffer,x          get character from buffer
:         wd      output            write character
:         tix    length            loop until all characters
:         jlt    wloop                have been written
:         rsub                      return to caller
: output  byte    x'06'            code for output device
:         end    first

+ -

관련 글 리스트
6645 C++ 코딩질문이요! syd9879 10081 2011/12/04
6646     Re:C++ 코딩질문이요! Lyn 12875 2011/12/04
6647         Re:Re:C++ 코딩질문이요! syd9879 12689 2011/12/04
6648             Re:Re:Re:C++ 코딩질문이요! Lyn 13364 2011/12/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.