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

C++빌더 Q&A
C++Builder Programming Q&A
[37696] Re:빌더 컴파일러만의 문제인가??
김태선 [jsdkts] 826 읽음    2004-10-20 15:11
C++빌더 컴파일러는 매우 충실하고 완성도가 높습니다.
컴파일러 문제라는 생각은 애초에 안하고 다른 원인을 생각하는 것이 좋습니다.
물론 빌더만의 특성을 타는 것은 따로 생각을 해야겠지요.

우선 님의 코드를 보면 에러없이 잘 컴파일 될게 당연합니다.

: TEScnro *EScnro; ==>   TEScnro EScnro; 이렇게 포인터 없이 사용해야하는거 아닌가요??(struct 사용할때처럼...)
: 그리고 EScnro->ShowMessage(msg); 이렇게 사용하는게 아니라
: EScnro.ShowMessage(msg);로 사용하는거 아닌가요??

맞습니다. 그렇게 쓰시면 됩니다. 그러나 객체는 가급적 포인트를 이용하게 정석이고요,
VCL 클래스에서 상속받은 경우는 반드시 포인트로 선언해서 써야 합니다.
그러나 문제는 아래 같으네요.

: AnsiString __fastcall ShowMessage(AnsiString msg)
: {
:     return "객체생성없이 왜 도냐?"; 
: }

이건 클래스 멤버함수가 아닙니다.
그냥 C++ 함수일 뿐이죠.

절대 객체가 생성되지 않았는데 되는 법은 C++ 나라에는 존재하지 않는 법입니다.
아직  빌더에 익숙하지 않으셔서 그런것 같은데, 조금 쓰시다보면 감을 잡으실 것 같네요.

참고로 AnsiString 타이핑하기 길죠..그냥 String 하시면 똑 같습니다.

그럼..




친구들 님이 쓰신 글 :
: 코드 가드를 이용했더니 다음과 같은 에러를 뱉어냅니다...
:
: Error 00164. 0x100C00 (Thread 0x0CA0):
: Method called on invalid object: Attempt to access 4 byte(s) at 0x00000000.
: Call Tree:
:    0x00414B8A(=AAAA.exe:0x01:013B8A) C:\test\EScnro.cpp#77
:        ===> 에러가 EScnro에서 발생해서 AScnro까지 던져주고 있습니다...
:    0x0043E67D(=AAAA.exe:0x01:03D67D) C:\test\DScnro.cpp#289
:    0x004497E0(=AAAA.exe:0x01:0487E0) C:\test\CScnro.cpp#132
:    0x0044A9E7(=AAAA.exe:0x01:0499E7) C:\test\BScnro.cpp#293
:    0x0044A30E(=AAAA.exe:0x01:04930E) C:\test\AScnro.cpp#229
:    0x400EE4E7(=vcl60.bpl:0x01:03D4E7)
: ------------------------------------------
: 위와 같은 에러를 수백개 뱉어내네요....메모리도 콸콸 세고.......-_-;;
: 문제는 invalid object라는 에러인데.... EScnro.cpp는 객체를 생성을 하지않고 쓰고 있습니다
: 여기서 제가 의문이 드는것은 객체 생성을 하지 않고 다음과 같이 사용했을때
: 런타임시에 객체가 없다고 에러를 뱉어야 하는데 어떻게 빌더가 에러없이 도는지 이해가 가지 않습니다...
:
: ============header 파일====================
:
: #ifndef EScnroH
: #define EScnroH
:
: //---------------------------------------------------------------------------
: class TEScnro
: {
: private:    // User declarations
: public:        // User declarations
:     __fastcall TEScnro();
:     AnsiString __fastcall ShowMessage(AnsiString msg);
: };
: //---------------------------------------------------------------------------
: extern PACKAGE TEScnro *EScnro;
: //---------------------------------------------------------------------------
:
: #endif
:
:
: ============cpp 파일====================
: #include "EScnro.h"
:
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
:
: TEScnro *EScnro;
:
: __fastcall TEScnro::TEScnro()
: {
: }
:
: AnsiString __fastcall ShowMessage(AnsiString msg)
: {
:     return "객체생성없이 왜 도냐?"; 
: }
:
: ============================================================================
:
: 만약 일반 c처럼 생각해서 객체 없이 함수만 호출한다고 한다면...
:
: TEScnro *EScnro; ==>   TEScnro EScnro; 이렇게 포인터 없이 사용해야하는거 아닌가요??(struct 사용할때처럼...)
: 그리고 EScnro->ShowMessage(msg); 이렇게 사용하는게 아니라
: EScnro.ShowMessage(msg);로 사용하는거 아닌가요??
:
: 위와 같이 코딩하면 왜 수행이 되는지 알려주시면 감사하겠습니다...
: 또한 메모리 누수 현상과도 관계가 있는지요??
:
: 아시는분 제발 가르쳐 주세요...급해요..ㅜ.ㅜ

+ -

관련 글 리스트
37675 빌더 컴파일러만의 문제인가?? 친구들 734 2004/10/19
37696     Re:빌더 컴파일러만의 문제인가?? 김태선 826 2004/10/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.