2010년/6월

5월7일 c++(extern,makefile생성내용,복사붙여넣기,자동차c++완성)

뽀얀햄스터 2010. 5. 7. 09:25

기본적으로 main.c 와 car.c를 사용할때 공통으로 사용하는 변수 즉 전역변수로 사용할경우 car.c와 main.c에 int A를 만들경우 양쪽다 심볼테이블로 A를 생성하게 된다. 그래서 합쳐서 컴파일할경우 중복선언이라는 컴파일에러가 뜬다. 그래서 이 전역변수를 양쪽에서 사용할경우 car.h파일에 extern int A로 선언을하여 양쪽에서 쓸수 있게 한다. 이렇게 되면 만약 car.c에 int A로  심볼테이블이생성되고 main.c같은경우는 A에 대한 자료형만 보고 심볼테이블을생성시키지 않고 다른곳에 심볼테이블 생성되어있다고 보고 컴파일을 진행시킨다.  그래서 보통

===========================================================================================
리눅스에서 창에서 다른 창으로 카피 방법  마우스로 드래그 후 마우스 휠을 클릭하면 복사를 할수있다.
============================================================================================

makefile생성과 사용방법~ 기본적으로 아트메가를 사용할때 우리가 컴파일시에 make해서실행했다. 그래서 컴파일시에 makefile을생성해서안에 기본적으로 넣어주면 아주 간단하게 컴파일도 할수 있고 내용를 바꿀수도 있다.
자자 makefile이다  기존에 나와있는 makefile은 보통 저기에서 더 붙여서 추가가 된내용이다 중요한점은 all: 한줄후에 tab를 눌려야하는 것이다.  그래서 tab으로 정렬해야 실행된다.
all:과 clean: test:는 명령어이다. make all make clean make test이며 젤 첫줄처럼 g++을 cc로 바꾸고 $()안에 넣어서 사용할수 있다.
그리고 @echo는 뒤에 내용를 출력해는 경우이다.





==CLASS================================================
=========================================================
어제까지만든 함수에서




car 구조체를 class로 바꾸었다 그리고 변수들을 접근을 private와 public을 바꾸어주고
변수를 private
함수를 public으로 해준다
함수를 class안에서 구현도 가능하다.
void State(void)
{
 a=10;
 b=10;
}
가능하다 하지만 Java같은경우는 모든 함수를 class에서 구현해야하지만 c++같은경우는 분리해서 사용이 가능하다  하지만 class 밖에서 함수를 구현하려면 기억해야할 부분이 있다.







State()함수는 분명 class 안으로 들어갔다 그렇게 되면 State()는 어디소속인지 밝혀야한다. 그래서 앞에다가 car붙게 되고 아까 말했듯이 class 밖에서 선언후 구현하려면 스코프(::)를 넣어야한다. 반드시 기억해야한다.



car *obj로 받았던 인수가 void로 변경되었고 그안에 인수를 어떻게 사용할까 구조체에서는 car.cName을 사용하였다. 하지만 class에서는 같은 class이기때문에 마치 전역변수처럼 그냥 막 쓸수가 있다. 정말어떻게 보면 편리하다. (*obj).iPrice=>> iPrice  그냥 변수처럼 사용되었다.

자다음은 메인함수에서 변경내용이다

원래 사용할때 input_car()함수만 선언하였다 하지만 car는 class이며 NewCar는 class 이름(객체)이다. 이 객체 전부 맞춰져있다. 그래서 NewCar를 사용할때 구조체처럼 NewCar.input_car();처럼  객체.인터페이스로 도트연산자로 사용한다.


접근속성은 3가지가 있다. 우리가 이미 알고 있는 public , private  두가지가 있고 나머지 하나로 protected(상속)있다.  

 
==========================================================================================
main.c
==========================================================================================
#include "car.h"
int main()
{
  car NewCar;
  NewCar.input_car();
  NewCar.State();
  return 0;
}
==========================================================================================
car.h
===================================================================================
#include<iostream>
using
 namespace std;
enum Car_Emer
{
  EON,
  EOFF,
  Em_END
};

enum Car_Handle
{
  LEFT,
  RIGHT,
  CENTOR,
  Han_END
};
enum Car_Color
{
  RED,
  BLACK,
  WHITE,
  BLUE,
  GRAY,
  COLOR_END
};
enum Car_Active
{
  FORWARD,
  BACKWARD,
  STOP,
  ACT_END
};
class car
{
  private:
    char cName[20];  
    int iPrice;
      Car_Color iColor;
    char vendor[10];
    Car_Active Active;
    Car_Handle Handle;
    Car_Emer Emer;
  public:
    void State(void);
    void input_car(void);
    void Set_Color(void);
    void Set_Active(void);
    void Set_Handle(void);
    void Set_Emer(void);
    void Set_cName(void);
    void Set_iPrice(void);
    void Set_vendor(void);
      
};
extern  char ACar_Color[COLOR_END][10];
extern  char ACar_Emer[Em_END][10];
extern  char ACar_Handle[Han_END][10];
extern  char ACAr_Active[ACT_END][10];
==========================================================================================
car.c
===================================================================================
#include "car.h"
char ACar_Color[COLOR_END][10]=
{
  "RED",
  "BLACK",
  "WHITE",
  "BLUE",
  "GRAY"

};
char ACar_Emer[Em_END][10]=
{
  "EON",
  "EOFF"
};
char ACar_Handle[Han_END][10]=
{
  "LEFT",
  "RIGHT",
  "CENTOR"
};
char ACar_Active[ACT_END][10]=
{
  "FORWARD",
  "BACKWARD",
  "STOP"
};
void car::Set_Color()
{
    cout<<"컬러입력"<<endl;
  
    int icnt;
    for(icnt=RED;icnt<COLOR_END;++icnt)
    {  
      cout<<icnt+1<<"번은" <<ACar_Color[icnt]<<endl;
    }
    cin>>icnt;
    if(icnt>RED)
    {
      if(icnt<=COLOR_END)
      {
        iColor=(Car_Color)(icnt-1);
      }
    }
    else
    {  
      cout<<"잘못입력하셨습니다"<<endl;
      car::Set_Color();
    }  
  }
void car::Set_Active()
{
  cout<<"동작입력"<<endl;
  int icnt;
  for(icnt=FORWARD;icnt<ACT_END;++icnt)
  {  
    cout<<icnt+1<<"번은" <<ACar_Active[icnt]<<endl;
  }
  cin>>icnt;
  if(icnt>FORWARD&&icnt<=ACT_END)
  {
    Active=(Car_Active)(icnt-1);
  }
  else
  {
      cout<<"잘못입력하셨습니다"<<endl;
      car::Set_Active();
  }  
}
void car::Set_Handle()
{
  cout<<"회전입력"<<endl;
  
  int icnt;
  for(icnt=LEFT;icnt<Han_END;++icnt)
  {  
    cout<<icnt+1<<"번은" <<ACar_Handle[icnt]<<endl;
  }
  cin>>icnt;
  if(icnt>LEFT&&icnt<=Han_END)
  {
     Handle=(Car_Handle)(icnt-1);
  }
  else
  {
    cout<<"잘못입력하셨습니다"<<endl;
    car::Set_Handle();
  }
}
void car::Set_Emer()
{
  cout<<"Emer"<<endl;
  
  int icnt;
  for(icnt=EON;icnt<Em_END;++icnt)
  {  
    cout<<icnt+1<<"번은" <<ACar_Emer[icnt]<<endl;
  }
  cin>>icnt;
  if(icnt>EON&&icnt<=Em_END)
  {
    Emer=(Car_Emer)(icnt-1);
  }
  else
  {
    cout<<"잘못입력하셨습니다"<<endl;
    car::Set_Emer();
  }

}
void car::Set_cName()
{
  cout<<"자동차이름을 입력하세요"<<endl;
  cin>>cName;


}
void car::Set_iPrice()
{
  int icnt;
  cout<<"자동차가격을 입력하세요"<<endl;
  cin>>icnt;
  iPrice=icnt;;

}
void car::Set_vendor()
{
  cout<<"제조회사를 입력하세요"<<endl;
  cin>>vendor;

}
void car::State()
{
  cout<<endl;
  cout<<"==================================="<<endl;
  cout<<"==================================="<<endl;
  cout<<"자동차이름은:"<<cName<<endl;
  cout<<"자동차가격은 :"<<iPrice<<"원"<<endl;
  cout<<"자동차 색상은 :"<<ACar_Color[iColor]<<endl;
  cout<<"자동차 동작은 :"<<ACar_Active[Active]<<endl;
  cout<<"자동차 핸들회전은:"<<ACar_Handle[Handle]<<endl;
  cout<<"자동차 현상태는 :"<<ACar_Emer[Emer]<<endl;
  cout<<"제조회사는 :"<<vendor<<endl;
  cout<<"==================================="<<endl;
  cout<<"==================================="<<endl;
cout<<endl;
}
void car::input_car()
{
  Set_cName();
  Set_iPrice();
  Set_vendor();
  Set_Color();
  Set_Active();
  Set_Handle();
  Set_Emer();
}
================================================================
================================================================
API
#include<windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
HINSTANCE g_hlnst;    //전역변수
LPCTSTR lpszClass=TEXT("First");//전역변수, 윈도우클래스를 정의하는데 사용, 타이틀바에 표시됨.

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevlnstance,LPSTR lpszCmdParam, int nCmdShow)
//엔트리포인트는 main()이 아니라 WinMain(),이다.
//윈도우를 만들고 화면에 표시하기만 할 뿐, 대부분의 일은 아래의 함수에서 이루어진다.
//WinMain에서 하는 가장 중요한 일은 메인 윈도우를 만드는 일이다.
{
  HWND hWnd;
  MSG Message;
  WNDCLASS WndClass;//만들어질 윈도우의 여러가지 특성을 정의하는 구조체
  g_hlnst=hInstance;//메인함수의 첫번째 인자인 hInstance를 전역변수에 대입

  WndClass.cbClsExtra=0;//특수한 목적에 사용되는 여분의 공간, 사용하지
  WndClass.cbWndExtra=0;//않을 때는 0으로 지정한다.
  WndClass.hbrBackground=CreateSolidBrush(RGB(255,220,255));
  //(HBRUSH)GetStockObject(BLUE_BRUSH);//배경색상 설정
  WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);  //커서지정
  WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION); //마우스지정
  WndClass.hInstance=hInstance; //클래스를 등록하는 프로그램 번호
  WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리함수를 지정(여기는 WndProc)
  WndClass.lpszClassName=lpszClass;//이름지정, 전역변수를 대입하므로 "First"가 들어감
  WndClass.lpszMenuName=NULL;//메뉴지정, NULL이므로 생략
  WndClass.style=CS_HREDRAW|CS_VREDRAW;  //윈도우의 스타일 정의
  
  RegisterClass(&WndClass);//이런 이런 특성을 가진 윈도우를 앞으로 사용하겠다고 등록함.
  //윈도우를 만들려면 윈도우 클래스를 등록한 후 CreateWindow함수를 호출한다.
  
  hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL|WS_THICKFRAME,CW_USEDEFAULT,CW_USEDEFAULT,
    CW_USEDEFAULT,CW_USEDEFAULT, NULL,(HMENU)NULL,hInstance,NULL);
  //등록된 클래스를 기본으로 실제 윈도우 생성(메모리에 진입)
  //이 함수의 인자들은 위에서 등록한 내용들이 각각의 인자로 들어온다.
  //이 함수는 윈도우에 관한 모든 정보를 메모리에 만든후 대표 번호인 윈도우 핸들을 반환한다.
  
  ShowWindow(hWnd,nCmdShow); //화면에 출력하는 함수. //첫번째 인자는 출력하고자 하는 윈도
  //우의 핸들이며 CreateWindow함수가 리턴한 값이다. 두번째 인자는 출력하는 방법 지정.

  //아래의 While문은 프로그램 메시지를 처리하는 부분이다.
  while(GetMessage(&Message,NULL,0,0)) //메시지를 읽어들여서 false가 리턴될때 까지 반복
  {
    TranslateMessage(&Message); //키보드에 이벤트가 발생하면 그 것을 나타 내 준다.
    DispatchMessage(&Message);  //받은 메시지를 WndProc함수로 전달한다
          //그러면 그 함수에서 메시지를 점검하여 동작하게 된다.
  }
  return (int)Message.wParam;
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam, LPARAM lParam)
//사용자와 시스템이 보내오는 메시지를 처리하는 함수. (운영체제에 의해 호출)
{
  switch (iMessage) 
  {
  case WM_CREATE:
    return 0;
  case WM_LBUTTONDOWN:
    return 0;
  case WM_RBUTTONDOWN:
    return 0;
  case WM_KEYDOWN:
    return 0;
  case WM_CHAR:
    return 0;
  case WM_DESTROY:   //사용자가 프로그램을 끝내려고 한다면
    PostQuitMessage(0);//이 함수를 호출하여 &message에 FALSE를 리턴한다.
    return 0;


  }
  return(DefWindowProc(hWnd,iMessage,wParam,lParam));//실제로 각 이벤트들이
      //수행되는 부분이다. (default이므로 별다른 코드가 필요없다.)
}

=============================================================
=============================================================