태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Exercise 17-2 

욕 판별 함수 작성하기.


윷놀이 게임 개발팀에서 채팅 내용이 욕인지 구별하는 함수의 작성을 요청해왔다. 

아래는 함수의 원형과 사용이 금지된 욕의 리스트가 있다. 인자로 넘겨진 문자열이 

욕 리스트에 있는 문자열과 일치하는 경우 true를 반환하도록 구현해보자.



bool IsTermOfAbuse (const char* pChatMessage );

바보, 병신, 나쁜, 미친




http://codepad.org/YXnbP5wX#output


원출처. 


출처 본문에는 4번 만들어놓고 쓰질 않아서 임의로 추가.


언제나 생각하는거지만 이 방법이 항상 옳은 정답이다 는 아님 같은 작동을 하는 다른 구성의 프로그램은 무한한 갯수이니까..

저작자 표시 비영리 변경 금지
신고
Posted by 졸가메

중복 정의, 미사용 변수, 변수간 타입의 차이에 의한 경고문 등..


프로그래밍을 하다보면 으레 이런 경고문들이 뜨게 마련이다.


프로그램 자체에는 영향을 주지 않는데 왠지 보이는게 꺼림찍 하다면


아래와 같은 방법으로 컴파일 시 경고문구가 뜨지 않게 하는것은 어떨까.[물론 왜 가렸는지는 주석을 통해서 알 수 있게 해야한다.]












을 하면 컴파일 시에 위의 번호에 해당하는 경고문구가 뜨지 않게된다.


그러하다고 합니다.


데굴데굴.


만들어놓고 나중에 쓸 예정인 변수라던가.


= 을 통한 타입이 다른 값의 대입 등에 쓰면 좋을 듯.


저작자 표시 비영리
신고
Posted by 졸가메
error LNK2019 에러의 경우

막 이 에러가 왜 나는가 해결법은 무엇인가 하는 글들이 많다.

하지만 실제로 그 행동을 해서 에러가 해결되지 않는 경우가 많다.

에러를 자세히 보면

왜 그런 에러가 나는지 알 수 있는데.

일단 에러를 보자.


오류 1 error LNK2019: "public: int __cdecl CMark::LoadMark(void)" (?LoadMark@CMark@@QAAHXZ) 외부 기호(참조 위치: "public: int __cdecl CMark::Init(void)" (?Init@CMark@@QAAHXZ) 함수)에서 확인하지 못했습니다. Mark.obj E9 (E9\Program Main\E9)


이 경우 무엇이 문제일까?

init 멤버함수 에서 사용되는 LoadMark 멤버함수가 정의되지 않았을 경우에 발생한다. 

 오류 1 error LNK2019: "public: int __cdecl CMark::FindMarkSavePos(void)" (?FindMarkSavePos@CMark@@QAAHXZ) 외부 기호(참조 위치: "public: int __cdecl CMark::AddMark(int,int,unsigned char,unsigned char,unsigned char,unsigned char,unsigned int,bool)" (?AddMark@CMark@@QAAHHHEEEEI_N@Z) 함수)에서 확인하지 못했습니다. Mark.obj E9 (E9\Program Main\E9)




오류 2 error LNK2019: "public: int __cdecl CMark::GetMarkSavePos(bool,int)" (?GetMarkSavePos@CMark@@QAAH_NH@Z) 외부 기호(참조 위치: "public: int __cdecl CMark::AddMark(int,int,unsigned char,unsigned char,unsigned char,unsigned char,unsigned int,bool)" (?AddMark@CMark@@QAAHHHEEEEI_N@Z) 함수)에서 확인하지 못했습니다. Mark.obj E9 (E9\Program Main\E9)



이 경우엔 무엇일까?

마찬가지로 AddMark에서 사용되는 FindMarkSavePos 와 GetMarkSavePos를 정의하지 않았기에 생기는 것이다.

오류라고 해서 네임으로 원인을 찾기보다는 문구를 자세히 들여다 보고 따로 검색을 하거나 원인을 찾는게 더 정확한 사례.
저작자 표시 비영리
신고
Posted by 졸가메
왜 발생하는가 -> 

extern struct_wpt* m_ptWptAll;

이런식으로 정해두고나서 쓰질 정의된 것이 없기때문에

참조를 하지 못하여 에러가 뜨는 것.


구글링을 해서 검색을 하면 무슨 라이브러리를 추가해야한다는둥 하는데

그냥 코딩을 잘못 한 것인 경우일 확률이 더 높다.

왜 저게 잘못되었냐.. 면 

struct_wpt* m_ptWptAll;

라는 문장을 코딩하지 않아서 이다.



위에

 extern struct_wpt* m_ptWptAll; 
라고 코딩한 내용은 선언이지 정의가 아니다.

다시 말해서 위의 extern 문은 프로그램안에 이런 변수가 있다고 알려주는 역할 밖에는 하지 않는다.
 

변수의 영역을 잡아주지도 않았는데 어떻게 참조할 수가 있겠는가?

그런고로  

.cpp 파일중 하나에서 
struct_wpt* m_ptWptAll;  

라는 문을 첨가해야 비로소 컴파일러는 해당 변수의 영역을 생성하는 코드를 만들게 된다.
 
저작자 표시 비영리
신고
Posted by 졸가메

void CMainFrame::OnUpdateWindow3(CCmdUI* pCmdUI)

{

       // TODO: Add your command update UI handler code here

       if(m_nWindowNum==3)

               pCmdUI->SetCheck(TRUE);

       else

               pCmdUI->SetCheck(FALSE);    

}

 
구글에서 검색해보면 대부분 이런식으로

SetCheck 를 사용하는 것들에 대한 글이 대다수이다.

하지만 이 방식은 대화상자를 특정 방식으로 생성했을 때에만 작동하며

그 이외에는 작동하지 않는다.


이럴때에

CMenu *hMenu = GetMenu();

   

  if(hMenu->GetMenuState(해당 메뉴의 아이디, MF_BYCOMMAND) != MF_CHECKED){ 

  hMenu->CheckMenuItem( 해당 메뉴의 아이디 , MF_CHECKED);

 }

 else{

  hMenu->CheckMenuItem( 해당 메뉴의 아이디 , MF_UNCHECKED);

 } 



처럼 CMenu 를 사용하여 메뉴의 체크 유무를 바꿔주고

메뉴에 관련된 변수들을 if문 안쪽에 넣어서 값을 변경해주면

다른 대화상자 생성조건으로도 메뉴의 체크를 바꿀 수 있다. 

 

저작자 표시 비영리
신고
Posted by 졸가메


티스토리 툴바