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
[54863] Re:Re:Graphic32에서 GR32_Transforms.hpp사용시 나는 에러
한빈짱 [hanbinjjang1] 1318 읽음    2008-10-13 13:43
답변달아주신 이정구 님  감사합니다.
추천해주신 예제는 이미 실행해봤으나 2007에서 안됬었구요.
빌더 6에서 된다는
이정구님의 말대로 빌더6 의 GR32_Transforms.hpp를 보니.

extern PACKAGE void __fastcall Adjoint(float * M);
extern PACKAGE float __fastcall Mult(const float * M1, const float * M2);

위와 같이 되어 있더군요.

헤더파일을 위와같이 변경하고 해보니 실행이 되는군요. ㅋ

흠.

하지만 위함수를 직접 사용해 보니, 그 땐 링커에서 위 함수를 찾을 수 없다는 에러가 나오네요.

그래서, 제가 생각한 결론은 c에서 위함수(배열을 반환하는 함수)는 사용할 수 없으며,

결국 선언을 지우고 쓰는게 맞는 듯 합니다.

GR32_Transforms.hpp의 523줄에서부터
//-- var, const, procedure ---------------------------------------------------
extern PACKAGE float IdentityMatrix[3][3];
extern PACKAGE bool FullEdge;
extern PACKAGE void __fastcall Adjoint(TFloatMatrix M);
//extern PACKAGE float __fastcall Determinant( TFloatMatrix  M);
extern PACKAGE void __fastcall Scale(TFloatMatrix M, float Factor);
extern PACKAGE void __fastcall Invert(TFloatMatrix M);
//extern PACKAGE float __fastcall Mult( TFloatMatrix M1,  TFloatMatrix M2);
//extern PACKAGE float __fastcall VectorTransform( TFloatMatrix M, TFloatMatrix V);
...
//extern PACKAGE Gr32::TFixed __fastcall FixedMatrix( TFloatMatrix FloatMatrix)/* overload */;
//extern PACKAGE float __fastcall FloatMatrix( const TFixedMatrix FixedMatrix)/* overload */;

위와 같이 고치면 반환 값이 없는 Adjoint, Scale, Invert 함수는 사용할 수 있습니다.
ex)
    TFloatMatrix a = { {1.0,2.0,3.0},{4.0,5.0,6.0},{7.0,8.0,9.0} };
    Scale(a, 10.0);
            --> a = { {10.0,20.0,30.0},{40.0,50.0,60.0},{70.0,80.0,90.0} };이 됩니다.






이정구 님이 쓰신 글 :
: GR32_Transforms.hpp 를 원래대로 고치신후, 다음 예제를 한번 실행해 보세요.
:
: http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=53331
:
: C++Builder6 에서는 정상적으로 실행되는 예제입니다.
:
: Mult, Adjoint 함수는 내부적으로 사용하는 것이므로 사용자가 직접 사용할 일은 없습니다.
:
:
:
: 한빈짱 님이 쓰신 글 :
: : Graphic32를 설치해서 단순히 이미지 그리는 것만 쓰다가
: :
: : 다른 무슨 기능이 있을까해서 컴포넌트에 포함된 예제파일을 하나하나 컴파일 해봤는데.
: :
: : cpp로 된 예제는 별루없고 거의 pas예제더군요. 다행히 C빌더2007이라, 컴파일은 되는..
: :
: : 어째든 ImgView_Layers_Ex예제가 레이어사용을 잘 설명해놓은 듯 해서
: :
: : 해당 pas소스를 cpp로 바꿔 볼려고 했더니..  에러가;;
: :
: :
: :
: : Graphic32중에 GR32_Transforms.hpp 를 인클루드 하면 에러가 나는 군요.
: :
: : 에러 내용을 보니 GR32_Transforms.hpp 파일에
: :
: : extern PACKAGE void __fastcall Adjoint( * M); 와 같이 함수가 선언이 되어 있더군요
: :
: : (* M) 인자를 이런식으로 넘겨줘서 에러가 나는 듯해서
: :
: : GR32_Transforms.pas 파일에서 Adjoint함수를 찾아보니
: :
: : TFloatMatrix = array[0..2, 0..2] of TFloat;                    ->hpp내용 : typedef float TFloatMatrix[3][3];
: : procedure Adjoint(var M: TFloatMatrix); 로 되어 있어
: :
: : extern PACKAGE void __fastcall Adjoint(TFloatMatrix M); 로 수정했더니 이 에러는 넘어가 졌습니다.
: :
: : hpp파일은 자동 생성되는 건데 pas-cpp호환 버그인가요;;
: :
: :
: : 하지만 문제는 지금부터!
: :
: : 에러내용은 [BCC32 Error] GR32_Transforms.hpp(530): E2091 Functions cannot return arrays or functions
: :
: : hpp의 내용 : extern PACKAGE TFloatMatrix __fastcall Mult( const * M1,  const * M2);
: :
: : 에러 내용은 함수 리턴 값으로 배열이 오면 안된다는 정도 인거 같은데 수정을 위해 pas파일을 보았습니다.
: :
: : function Mult(const M1, M2: TFloatMatrix): TFloatMatrix;
: : var
: :   i, j: Integer;
: : begin
: :   for i := 0 to 2 do
: :     for j := 0 to 2 do
: :       Result[i, j] :=
: :         M1[0, j] * M2[i, 0] +
: :         M1[1, j] * M2[i, 1] +
: :         M1[2, j] * M2[i, 2];
: : end;
: :
: : TFloatMatrix Result를 반환하는 함수인듯한데
: :
: : 델파이에서는 배열을 반환하는 것이 가능한가 봅니다.
: :
: : cpp에서는 리턴값이 배열이 안되나본데..
: :
: : 그러면 GR32_Transforms.hpp는 cpp에서 사용할 수 없는 건가요???
: :
: : 제가 너무 걷돌았나요??
: : 질문은 GR32_Transforms.hpp를 인클루드 해서 쓰는 법!! 입니다;;

+ -

관련 글 리스트
54808 Graphic32에서 GR32_Transforms.hpp사용시 나는 에러 한빈짱 1389 2008/10/08
54845     Re:Graphic32에서 GR32_Transforms.hpp사용시 나는 에러 이정구 1154 2008/10/10
54863         Re:Re:Graphic32에서 GR32_Transforms.hpp사용시 나는 에러 한빈짱 1318 2008/10/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.