본문 바로가기
코스웨어/16년 스마트컨트롤러

20160411_장진웅_업무일지_구조체로 도서관 프로그래밍

by 알 수 없는 사용자 2016. 4. 11.
728x90
반응형

 CC=gcc
 RM=rm -rf
 OUTPUT = main

 BOOK_NAME=30

 MSG_LINK = linking...
 MSG_END = compile complete...

 MSG_BOOK_START = book.c comile...
 MSG_BOOK_END = book.c compile end...

 MSG_MAIN_START = main.c compile...
 MSG_MAIN_END = main.c compile end...

 MSG_BEGIN = ------- begin -------
 MSG_END = ------- end -------


 all: begin book main build end

 rebuild: clean all

 build:
     @echo $(MSG_LINK)
     @$(CC) -o $(OUTPUT) main.o book.o

 book:
     @echo $(MSG_BOOK_START)
     @$(CC) -DBNAME_LEN=$(BOOK_NAME) -c book.c
     @echo $(MSG_BOOK_END)
     @echo

 main:
     @echo $(MSG_MAIN_START)
     @$(CC) -DBNAME_LEN=$(BOOK_NAME) -c main.c
     @echo $(MSG_MAIN_END)
     @echo

 begin:
     @echo
     @echo $(MSG_BEGIN)

 end:
     @echo $(MSG_END)
     @echo

 clean:
     $(RM) main.o
     $(RM) book.o
     $(RM) $(OUTPUT)

<출력결과>

위와 같이 makefile을 수정하면 ATMega에서 보았던 makefile을 내가 만들 수 있다. (대박!)

<추가설명>

@echo는 printf와 같다고 할 수 있다.

$(MSG_LINK)는 'linking...'로 출력된다.

@$(CC) -o $(OUTPUT) main.o book.o는 @echo가 없기 때문에 화면에 출력되지 않는다.

$(CC)는 gcc, $(OUTPUT)은 main을 뜻한다.

gcc -o main main.o book.o 는 main.o, book.o 파일을 main으로 합친다.

$(MSG_BOOK_START)는 'book.c compile...'로 출력된다.

$(MSG_BOOK_END)는 'book.c compile end...'로 출력된다.

$(MSG_MAIN_START)은 'main.c compile...'로 출력된다.

$(MSG_MAIN_END)은 'main.c compile end...'로 출력된다.

$(MSG_BEGIN)은 '------- begin -------'로 출력된다.

$(MSG_END)은 '------- end -------'로 출력된다.

$(RM)은 'rm -rf'을 뜻한다.

$(OUTPUT)은 'main'을 뜻한다. 


그리고 대망의 구조체를 이용한 간단한? 도서관 프로그래밍 ㅠㅠ

#include "book.h"

static Book * Head;

void Book_Insert()
{
      Book * temp = malloc(sizeof(Book));
      Book * com;
      Book * pos;

      if(0==temp)
      {
          printf("No free memory \n");
          return ;
      }
      printf("Book Name: \n");
      fgets(temp->caName, BNAME_LEN, stdin);
      temp-> caName[strlen(temp-> caName)-1]=0;

      printf("Publication: \n");
      fgets(temp->caPub, BPUB_LEN, stdin);
      temp-> caPub[strlen(temp-> caPub)-1]=0;

      printf("Book Price:  \n");
      scanf("%d", &(temp-> uiPri));
      while(getchar() != '\n');

      //searching...
      pos=Head;
      com=Head; //중간에 연결리스트 앞을 찾기위해 필요하다.
      while(pos!=0)
      {
          //비교문 필요
          if(0<strcmp(pos-> caName, temp-> caName))
          {
              break;
          }
              com=pos;
              pos=pos->Next;

      }
      if(Head==0) //연결 리스트가 존재하지 않을 경우 첫번째
      {
          temp-> Next=Head;
          Head=temp;
  }
      else //중간, 끝 삽입.
      {
          if(Head==pos)//제일 앞이면
          {
              temp-> Next=pos;
              Head=temp;
          }
          else
          {
              temp-> Next=pos;
              com-> Next=temp;
          }
      }
}

void Book_Print()
{
     printf("===================== \n");
     printf("      Book List \n");
      while(0!=Head)
     {
     printf("--------------------- \n");
     printf("Book Name: [%s] \n", Head-> caName);
     printf("Publication: [%s] \n", Head-> caPub);
     printf("Book Price: [%d] \n", Head-> uiPri);
     Head = Head -> Next;
     }
     printf("==================== \n");
}

void Book_Free()
{
      Book *temp;
      while(0!=Head)
      {
      temp=Head;
      Head=temp-> Next;
      free(temp);
      }
}

<출력결과>

컴파일 끝

입력 결과

이어서 위 프로그래밍의 구조체가 어떻게 작동하는지에 대해서 그림을 그려보았습니다...

제가 정확히 이해하지 못하고 있기 때문에 잘못된 점이 있다면 지적 부탁드립니다.



728x90