Search Results for 'C++'

4 POSTS

  1. 2007/08/01 enum
  2. 2007/05/27 [디버깅] LNK2005 에러의 예와 그 대처법
  3. 2007/05/02 [디버깅] 에러 보고 LINK2001
  4. 2007/01/03 첫번째 책 리뷰

enum

Posted 2007/08/01 13:30, Filed under: Code Factory
// C4482.cpp
// compile with: /c /W1

struct S {
  enum E { a };
};

int i = S::E::a;   // C4482
int j = S::a;   // OK

enum - 열거체의 경우 잘못된 사용법에 따라 지적을 받았는데,
Gpg에 질의하여 왜 잘못되었는지 알게 되었다.
열거체로 정의했을 경우 SKILL::ICEBALL 같은 것은 오류 라는것!
당연한 이야기만 위와같은 예는 네임스페이스가 아니기 때문이다.
그것을 보안하기 위해 namespace나 위와같이 struct로 감싸는 것이 좋다.

namespace VTX_BOX
{
  enum{ FVF = ~ }
}

Leave a comment



저같은 경우는 디버그모드 에서 릴리즈 모드로 변경시킬때,
다음과 같이 라이브러리 중첩 에러가 발생했습니다.

LIBCD.lib(asin.obj) : error LNK2005: _asin already defined in msvcrtd.lib(MSVCRTD.dll)

Project -> Setting -> Link탭에서

Ignore all default libraries 옵션을 적용시켜서 해결 했습니다.


사용자 삽입 이미지



* LIBCMTD.lib 중복 선언에러(LNK2005)  : CRT (* 표준 C/C++ 런타임 라이브러리 참조)

에러원인 :
CRT 라이브러리가 MFC 라이브러리 전에 링크되면 LNK2005 오류가 발생한다.
MFC나 VC관련 라이브러리와 동일한 함수가 CRT에도 존재하기 때문에 발생되는 에러이다.

에러메시지 :
nafxcwd.lib(afxmem.obj) : 오류 LNK2005:"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z)이(가) LIBCMTD.lib(new.obj)에 이미 정의되어 있습니다.

해결방법 :
CRT 라이브러리 링크 무시.
VC98 : Project -> Setting 메뉴에 Link탭에서  프로젝트 옵션에 /nodefaultlib:"libcmtd.lib" 를 아무데나 삽입

.NET : Linker -> Input 메뉴에서 IgnoreSpecific Library에 libcmtd.lib 입력
링커 명령줄은 /NOD:libcmtd.lib 명령과 동일


링크 순서를 확인하는 방법 :
1. Project 메뉴에서 Settings을 눌러 Project Settings 대화 상자를 엽니다.
2. Settings For 뷰에서 링크 오류가 발생하는 프로젝트 구성을 선택(강조 표시)합니다.
3. Link 탭을 누릅니다.
4. Project Options 대화 상자에 다음을 입력합니다. /verbose:lib
5. 프로젝트를 다시 빌드. 링크하는 과정에서 출력 창에 라이브러리가 표시됩니다.

참고 싸이트 : www.naver.com
환경 : XP pro, Visual C++ 6.0


Leave a comment

[디버깅] 에러 보고 LINK2001

Posted 2007/05/02 23:12, Filed under: Code Factory

릴리즈 모드에서 inline으로 선언된 함수가 LINK2001 에러를 발생시켰습니다.

inline 키워드를 삭제하니 에러가 발생되지 않았습니다. -_-??

Leave a comment

첫번째 책 리뷰

Posted 2007/01/03 17:43, Filed under: Programming

사용자 삽입 이미지


저자 Noel Llopis | 역자 최현호 | 출판사 정보문화사

방학 기간동안 여러가지 책을 읽어보고 리뷰를 하려고 합니다.  작심3일이 되지 않길 빌어야 지요.
비교적 간단해 보이는 책을 덜컥 골랐지만, 생각 외로 깊은 내용을 담고 있어 놀라웠습니다.
C++ 에 대해선 한번쯤 생각해 봐야할 내용들이 책에 많이  포함되어 있네요.
C++에 대한 기본 지식을 가지고 있는 유저에게 맞는 책으로,
곰곰히 생각해 봤지만 C++ 을 처음 접하시는 분에겐 무용지물 일것 같습니다.
게임 프로그래밍의 특성상 다른 프로그래밍에서 간과하기 쉬운 성능에 대한 부분의
저자의 의견이 다수 포함되어 있고, 게임 엔진의 아웃트라인을 잡는데 어렴풋이나마 도움이 될것 같습니다.
물론 제 생각 이지만요~ " 한번쯤 읽어보면 아주 유익한 책 " 이란 결론을 내립니다.

난이도 : A  /  재미 : D / 읽기쉬움 : C / 유익함 : B+

리뷰 part 1.

게임 프로그래머를 위한 C++

1.
상호작용이 가능한 속도로 실행된다.

2.       최소한의 프레임 속도(초당 30-60 프레임)를 보장한다.

3. 기계를 장악하거나 혹은 거의 대부분을 제어한다.

4.       매우 많은 자원을 이용한다.

5.       다중-플랫폼 환경을 위해 개발된다.


Part 1.



C++
의 힘을 끌어내자.

클래스

상속

Enemy 클래스를 토대로 Boss 클래스를 만들 수 있다.

부모 클래스의 특정함수를 완전히 대체하지 않고 약간 추가 하려면 다음과 같이 구현을 작성한다.


void
Boss::RunAI()

{

        Enemy::RunAI();

}


다형성과

다형성은 여러가지 타입의 유닛들을 실제의 형에 관계없이 한 번의 함수 호출로 모든 적 유닛들을 관리할 수 있게 한다.


가상함수

포인터는 부모형이고 개체가 자식이면 부모의 선언된 함수가 가상 함수인지의 여부에 따라 함수 호출이 달라진다.


규칙 1: 포함 vs 상속

상속할 때는 ~이다 의 관계가 성립 하여야 한다. 가진다 라고 말할 수 있는 것을 포함이라고 한다. 상속을 이용해야 하는지 결정하기 힘들다면 하지 않는 것이 좋다.


규칙 2: 동작 vs 데이터

데이터가 아닌 동작을 변경하는 경우에만 상속을 이용한다.


상속을 이용할 상황과 피해야 할 상황

가상 함수를 이용 하는 데는 얼마간의 성능 저하가 따른다. 가상함수의 선택은 신중해야 한다.


상속의 구현(고급)

단 한 개라도 가상 함수를 포함하는 클래스는 모두 vtable을 가지며, 테이블의 적절한 슬롯을 인덱스하는 방식으로 런타임 시에 호출될 함수를 결정한다. vtable은 개체가 아닌 클래스 당 한 개씩 존재한다. 256*256 크기의 맵이 필요하다면 개체의 수는 65,536개가 된다. 각각의 객체가 vtable을 가질 필요는 없으며, 대신 vtable을 가리키는 포인터만큼 거지게 된다. 포인터를 위한 64KB vtable 자체의 크기만큼 메모리를 더 사용하게 된다.


비용 분석(고급)

과정 1. 특이한 점이 없어 보이는 함수 호출로 시작된다.

pEnemyUnit->RunAI();

과정 2. 해당 개체의 vtable 포인터를 얻는다.

과정 3. 호출하고자 하는 함수에 해당하는 오프셋 항목을 vtable에서 얻는다.

과정 4. vtable 항목에 지정된 주소로 함수 호출이 이루어진다.


상속과 가상 함수를 이용해 특정한 동작을 오버라이드하도록 게임 구조가 만들어졌다면 뒤늦게 이 구조를 변경하는 일이 극히 어렵다는 것이다.

가장 좋은 방법은 프로그램 내에서 가상 함수를 호출할 때 일어나는 결과를 이해하고 게임을 개발할 때 이를 염두에 두는 것이다. 물론 논리적인 지식만으로 게임이 실행되는 상황에서의 많은 작업과 프로파일링, 예상한 만큼의 결과가 나타났는지를 확인하는 등의 일을 대신할 수는 없다.


대안(고급)

상속을 통하지 않고 C를 이용해 비슷한 기능을 구현해보는 것.

1.       하나의 구조체와 다수의 조건문 : 모든 구조체가 같은 크기가 되므로 메모리 낭비와 if 문의 수가 늘어나면 더욱 심각한 성능 저하가 발생한다.

2.       하나의 구조와 switch 문의 이용 : 컴파일러는 결국 if 문을 이용한 것과 동일한 코드를 만들어낼 가능성이 높다.

3.       포인터 테이블 : 성능 면에서는 상속과 가상 함수를 이용한 것과 동일하다. 차라리 컴파일러에게 맡겨두는 것이 좋다.

앞서 소개한 방법들보다는 상속과 가상 함수를 이용하는 것이 좋으며, 코드의 최적화나 관리 면에서는 우리보다 컴파일 능력이 뛰어나다.


프로그램 아키텍처와 상속(고급)

상속은 프로그램의 아키텍처에 전반적으로 좋지 않은 영향을 줄 수 있다. 상속은 또한 프로그램 디자인을 경색시키는 효과가 있다. 포함은 상속과는 달리 프로그램 디자인을 경색시키지 않으며 유연한 상태를 유지시켜준다. 그러나 모든 상속을 포함으로 대체하는 것을 권장하는 것은 아니다. 상속이 문제가 될수 있을만한 부분, , 상속의 수준이 지나치게 깊어질 경우에는 포함을 이용하여 두 단계나 세 단계의 작은 단계로 나눌 수 있다.


Leave a comment


Recent Posts

  1. [참고자료] 모니터 해상도 도표
  2. [런타임에러] Expression: map/set it..
  3. *. 플러그인 랩퍼 사용하기 ( 3DS MAX..
  4. *. 스키닝 오프셋 벡터 [Offset Vecto..
  5. November 2007 DirectX SDK News

Recent Comments

  1. 관리자만 볼 수 있는 댓글입니다. 06/24

Recent Trackbacks

Calendar

«   2009/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

  1. Cafe24
  2. ForTheProgramming
  3. Tatter Tools
  4. 근석이
  5. 진호네

Site Stats

TOTAL 14477 HIT
TODAY 4 HIT
YESTERDAY 16 HIT
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.