Q&A

  • C++소스를 델파이로 변환시키는데 문제..
안녕하세요?

제가 C++을 이해를 못해서 그런데 다음 소스좀 델파이로 변환하는데 문제가 있네요..갈쳐주세요.



Rudder.h

---------------------------------------------------------------------------------

// Rudder.h: interface for the CRudder class.



//



//////////////////////////////////////////////////////////////////////







#if !defined(AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_)



#define AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_







#if _MSC_VER > 1000



#pragma once



#endif // _MSC_VER > 1000







#include "Motion.h"



#include "Propeller.h"







#define PI 3.141592



#define Rho 104.61







class CRudder



{



public:



double smm_Height,smm_Area,smm_AspectRatio,smm_RudderXPosition;



double smm_RudderWake,smm_RudderWake0;



double smm_TR,smm_AH,smm_XH;



double smm_RudderAngle,smm_OrderRudderAngleD,smm_OrderRudderAngle;



double smm_Dot_RudderAngle,smm_Dot_MaxRudderAngle;



double smm_Nd_LR,smm_GammaR,smm_TE;







double smm_NormalForce;



double smm_RudderXForce,smm_RudderYForce,smm_RudderNMoment;







public:



CRudder();



virtual ~CRudder();







void RudderFN(CMotion &motion,CPropeller &propeller);



double RudderXForce(CMotion &motion,CPropeller &propeller);



double RudderYForce(CMotion &motion,CPropeller &propeller);



double RudderNMoment(CMotion &motion,CPropeller &propeller);



void Steer();



};







#endif // !defined(AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_)

---------------------------------------------------------------------------------



Rudder.cpp입니다.

----------------------------------------------------------------------------------

// Rudder.cpp: implementation of the CRudder class.



//



//////////////////////////////////////////////////////////////////////







#include "stdafx.h"



#include "Rudder.h"



#include "math.h"







//////////////////////////////////////////////////////////////////////



// Construction/Destruction



//////////////////////////////////////////////////////////////////////







CRudder::CRudder()



{



smm_Height = 7.70;



smm_Area = 26.69;



smm_AspectRatio = 1.833;



smm_AH = 0.261;



smm_Nd_LR = -0.90;



smm_Dot_MaxRudderAngle = 3.0*PI/180.0;



smm_RudderWake0 = 0.270;



smm_RudderXPosition = -0.5;



smm_TR = 0.29;



smm_XH = -0.45;



smm_GammaR = 0.5;



smm_RudderAngle = 0.0;



smm_OrderRudderAngleD = 0.0;



smm_OrderRudderAngle = smm_OrderRudderAngleD*PI/180.0;



smm_TE = 2.5;



}







CRudder::~CRudder()



{







}







void CRudder::RudderFN(CMotion &motion,CPropeller &propeller)



{



double Eta,Epsilon,Kapa;



double ResultRudderVel,AlphaR,AlphaRMax,FAlpha;



double SlipRatio;



double XVel,YVel;







FAlpha = 6.13*smm_AspectRatio/(smm_AspectRatio+2.25);







if(smm_Height


Eta = 1.0;



else



Eta = propeller.smm_Dia/smm_Height;







smm_RudderWake = propeller.smm_ProWake*smm_RudderWake0/propeller.smm_ProWake0;







Epsilon = (1.0-smm_RudderWake)/(1.0-propeller.smm_ProWake);







Kapa = 0.6/Epsilon;







SlipRatio = 1.0-propeller.smm_ProVel/(propeller.smm_RPS*propeller.smm_Pitch);







if(motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS < 0.0)



{



ResultRudderVel = 0.0;



AlphaR = 0.0;



}







else if(motion.smm_SurgeVel < 0.0 && propeller.smm_RPS<= 0.0)



{



ResultRudderVel = sqrt(pow(motion.smm_SurgeVel,2)+pow(motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel,2));



AlphaR = -smm_RudderAngle+atan2((motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel),fabs(motion.smm_SurgeVel));



}







else



{



if(motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS > 0.0 && SlipRatio >= 0.0)



{



XVel = Epsilon*propeller.smm_RPS*propeller.smm_Pitch



*sqrt(1.0-2.0*(1.0-Eta*Kapa)*SlipRatio+(1.0-Eta*Kapa*(2.0-Kapa))*pow(SlipRatio,2));



}







else if((motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS > 0.0 && SlipRatio < 0.0 )



|| (motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS == 0.0))



{



XVel = motion.smm_SurgeVel*(1.0-smm_RudderWake);



}







else if(motion.smm_SurgeVel < 0.0 && propeller.smm_RPS > 0.0)



{



XVel = motion.smm_SurgeVel+0.6*sqrt(Eta)*propeller.smm_RPS*propeller.smm_Pitch;



}







YVel = -smm_GammaR*(motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel);







if(XVel < 0.0001) XVel = 0.0;



if(XVel <= 0.0)



{



XVel = 0.0;



YVel = 0.0;



}







ResultRudderVel = sqrt(pow(XVel,2)+pow(YVel,2));







AlphaR = smm_RudderAngle-atan2(YVel,XVel);







AlphaRMax = 35.0*PI/180.0;







if(fabs(AlphaR) > AlphaRMax)



{



if(AlphaR >0) AlphaR = AlphaRMax;



else AlphaR = -AlphaRMax;



}



}







smm_NormalForce = 0.5*Rho*smm_Area*pow(ResultRudderVel,2)*FAlpha*sin(AlphaR);



}







double CRudder::RudderXForce(CMotion &motion,CPropeller &propeller)



{



RudderFN(motion,propeller);







smm_RudderXForce = -(1.0-smm_TR)*smm_NormalForce*sin(smm_RudderAngle);







return smm_RudderXForce;



}







double CRudder::RudderYForce(CMotion &motion,CPropeller &propeller)



{



RudderFN(motion,propeller);







smm_RudderYForce = -(1.0+smm_AH)*smm_NormalForce*cos(smm_RudderAngle);







return smm_RudderYForce;



}







double CRudder::RudderNMoment(CMotion &motion,CPropeller &propeller)



{



RudderFN(motion,propeller);







smm_RudderNMoment = -(smm_RudderXPosition+smm_AH*smm_XH)*motion.smm_LBP*smm_NormalForce*cos(smm_RudderAngle);







return smm_RudderNMoment;



}







void CRudder::Steer()



{



smm_OrderRudderAngle = smm_OrderRudderAngleD*PI/180.0;







smm_Dot_RudderAngle = (smm_OrderRudderAngle-smm_RudderAngle)/smm_TE;







if(fabs(smm_Dot_RudderAngle) > smm_Dot_MaxRudderAngle)



{



if(smm_Dot_RudderAngle > 0.0) smm_Dot_RudderAngle = smm_Dot_MaxRudderAngle;



else smm_Dot_RudderAngle = -smm_Dot_MaxRudderAngle;



}



}

----------------------------------------------------------------------------------



이 부분중에서 제가 특히 이해가 안가는 부분은 생성자의 소멸자를 다루는건데요.

위의 부분중에서 하나입니다.

double RudderNMoment(CMotion &motion,CPropeller &propeller);



Motion.h의 Class를 델파이로 변환시에는

procedure RuddreNMoment(?) double;



그리고 Cpp문에서도

double CRudder::RudderNMoment(CMotion &motion,CPropeller &propeller)

이렇게 정의하는 부분 있지요

이걸 델파이의 한 Unit로 구성할때는 Class를 정의하는것과 함수를 참조하는것을 예를 들어서 갈켜주시면 감사하겠어요 그럼 수고하세요..



1  COMMENTS
  • Profile
    이채성 2001.12.26 22:21
    C Builder에서 컴파일 한 후

    Obj단에서 링크하면

    Delphi에서 C 소스를 사용할 수 있습니다.



    그 방법을 사용하시면 어떻습니까?



    우나기 wrote:

    > 안녕하세요?

    > 제가 C++을 이해를 못해서 그런데 다음 소스좀 델파이로 변환하는데 문제가 있네요..갈쳐주세요.

    >

    > Rudder.h

    > ---------------------------------------------------------------------------------

    > // Rudder.h: interface for the CRudder class.

    >

    > //

    >

    > //////////////////////////////////////////////////////////////////////

    >

    >

    >

    > #if !defined(AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_)

    >

    > #define AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_

    >

    >

    >

    > #if _MSC_VER > 1000

    >

    > #pragma once

    >

    > #endif // _MSC_VER > 1000

    >

    >

    >

    > #include "Motion.h"

    >

    > #include "Propeller.h"

    >

    >

    >

    > #define PI 3.141592

    >

    > #define Rho 104.61

    >

    >

    >

    > class CRudder

    >

    > {

    >

    > public:

    >

    > double smm_Height,smm_Area,smm_AspectRatio,smm_RudderXPosition;

    >

    > double smm_RudderWake,smm_RudderWake0;

    >

    > double smm_TR,smm_AH,smm_XH;

    >

    > double smm_RudderAngle,smm_OrderRudderAngleD,smm_OrderRudderAngle;

    >

    > double smm_Dot_RudderAngle,smm_Dot_MaxRudderAngle;

    >

    > double smm_Nd_LR,smm_GammaR,smm_TE;

    >

    >

    >

    > double smm_NormalForce;

    >

    > double smm_RudderXForce,smm_RudderYForce,smm_RudderNMoment;

    >

    >

    >

    > public:

    >

    > CRudder();

    >

    > virtual ~CRudder();

    >

    >

    >

    > void RudderFN(CMotion &motion,CPropeller &propeller);

    >

    > double RudderXForce(CMotion &motion,CPropeller &propeller);

    >

    > double RudderYForce(CMotion &motion,CPropeller &propeller);

    >

    > double RudderNMoment(CMotion &motion,CPropeller &propeller);

    >

    > void Steer();

    >

    > };

    >

    >

    >

    > #endif // !defined(AFX_RUDDER_H__F488B307_C1DF_11D4_A944_00E04C392C3E__INCLUDED_)

    > ---------------------------------------------------------------------------------

    >

    > Rudder.cpp입니다.

    > ----------------------------------------------------------------------------------

    > // Rudder.cpp: implementation of the CRudder class.

    >

    > //

    >

    > //////////////////////////////////////////////////////////////////////

    >

    >

    >

    > #include "stdafx.h"

    >

    > #include "Rudder.h"

    >

    > #include "math.h"

    >

    >

    >

    > //////////////////////////////////////////////////////////////////////

    >

    > // Construction/Destruction

    >

    > //////////////////////////////////////////////////////////////////////

    >

    >

    >

    > CRudder::CRudder()

    >

    > {

    >

    > smm_Height = 7.70;

    >

    > smm_Area = 26.69;

    >

    > smm_AspectRatio = 1.833;

    >

    > smm_AH = 0.261;

    >

    > smm_Nd_LR = -0.90;

    >

    > smm_Dot_MaxRudderAngle = 3.0*PI/180.0;

    >

    > smm_RudderWake0 = 0.270;

    >

    > smm_RudderXPosition = -0.5;

    >

    > smm_TR = 0.29;

    >

    > smm_XH = -0.45;

    >

    > smm_GammaR = 0.5;

    >

    > smm_RudderAngle = 0.0;

    >

    > smm_OrderRudderAngleD = 0.0;

    >

    > smm_OrderRudderAngle = smm_OrderRudderAngleD*PI/180.0;

    >

    > smm_TE = 2.5;

    >

    > }

    >

    >

    >

    > CRudder::~CRudder()

    >

    > {

    >

    >

    >

    > }

    >

    >

    >

    > void CRudder::RudderFN(CMotion &motion,CPropeller &propeller)

    >

    > {

    >

    > double Eta,Epsilon,Kapa;

    >

    > double ResultRudderVel,AlphaR,AlphaRMax,FAlpha;

    >

    > double SlipRatio;

    >

    > double XVel,YVel;

    >

    >

    >

    > FAlpha = 6.13*smm_AspectRatio/(smm_AspectRatio+2.25);

    >

    >

    >

    > if(smm_Height
    >

    > Eta = 1.0;

    >

    > else

    >

    > Eta = propeller.smm_Dia/smm_Height;

    >

    >

    >

    > smm_RudderWake = propeller.smm_ProWake*smm_RudderWake0/propeller.smm_ProWake0;

    >

    >

    >

    > Epsilon = (1.0-smm_RudderWake)/(1.0-propeller.smm_ProWake);

    >

    >

    >

    > Kapa = 0.6/Epsilon;

    >

    >

    >

    > SlipRatio = 1.0-propeller.smm_ProVel/(propeller.smm_RPS*propeller.smm_Pitch);

    >

    >

    >

    > if(motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS < 0.0)

    >

    > {

    >

    > ResultRudderVel = 0.0;

    >

    > AlphaR = 0.0;

    >

    > }

    >

    >

    >

    > else if(motion.smm_SurgeVel < 0.0 && propeller.smm_RPS<= 0.0)

    >

    > {

    >

    > ResultRudderVel = sqrt(pow(motion.smm_SurgeVel,2)+pow(motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel,2));

    >

    > AlphaR = -smm_RudderAngle+atan2((motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel),fabs(motion.smm_SurgeVel));

    >

    > }

    >

    >

    >

    > else

    >

    > {

    >

    > if(motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS > 0.0 && SlipRatio >= 0.0)

    >

    > {

    >

    > XVel = Epsilon*propeller.smm_RPS*propeller.smm_Pitch

    >

    > *sqrt(1.0-2.0*(1.0-Eta*Kapa)*SlipRatio+(1.0-Eta*Kapa*(2.0-Kapa))*pow(SlipRatio,2));

    >

    > }

    >

    >

    >

    > else if((motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS > 0.0 && SlipRatio < 0.0 )

    >

    > || (motion.smm_SurgeVel >= 0.0 && propeller.smm_RPS == 0.0))

    >

    > {

    >

    > XVel = motion.smm_SurgeVel*(1.0-smm_RudderWake);

    >

    > }

    >

    >

    >

    > else if(motion.smm_SurgeVel < 0.0 && propeller.smm_RPS > 0.0)

    >

    > {

    >

    > XVel = motion.smm_SurgeVel+0.6*sqrt(Eta)*propeller.smm_RPS*propeller.smm_Pitch;

    >

    > }

    >

    >

    >

    > YVel = -smm_GammaR*(motion.smm_SwayVel+smm_Nd_LR*motion.smm_LBP*motion.smm_YawAngleVel);

    >

    >

    >

    > if(XVel < 0.0001) XVel = 0.0;

    >

    > if(XVel <= 0.0)

    >

    > {

    >

    > XVel = 0.0;

    >

    > YVel = 0.0;

    >

    > }

    >

    >

    >

    > ResultRudderVel = sqrt(pow(XVel,2)+pow(YVel,2));

    >

    >

    >

    > AlphaR = smm_RudderAngle-atan2(YVel,XVel);

    >

    >

    >

    > AlphaRMax = 35.0*PI/180.0;

    >

    >

    >

    > if(fabs(AlphaR) > AlphaRMax)

    >

    > {

    >

    > if(AlphaR >0) AlphaR = AlphaRMax;

    >

    > else AlphaR = -AlphaRMax;

    >

    > }

    >

    > }

    >

    >

    >

    > smm_NormalForce = 0.5*Rho*smm_Area*pow(ResultRudderVel,2)*FAlpha*sin(AlphaR);

    >

    > }

    >

    >

    >

    > double CRudder::RudderXForce(CMotion &motion,CPropeller &propeller)

    >

    > {

    >

    > RudderFN(motion,propeller);

    >

    >

    >

    > smm_RudderXForce = -(1.0-smm_TR)*smm_NormalForce*sin(smm_RudderAngle);

    >

    >

    >

    > return smm_RudderXForce;

    >

    > }

    >

    >

    >

    > double CRudder::RudderYForce(CMotion &motion,CPropeller &propeller)

    >

    > {

    >

    > RudderFN(motion,propeller);

    >

    >

    >

    > smm_RudderYForce = -(1.0+smm_AH)*smm_NormalForce*cos(smm_RudderAngle);

    >

    >

    >

    > return smm_RudderYForce;

    >

    > }

    >

    >

    >

    > double CRudder::RudderNMoment(CMotion &motion,CPropeller &propeller)

    >

    > {

    >

    > RudderFN(motion,propeller);

    >

    >

    >

    > smm_RudderNMoment = -(smm_RudderXPosition+smm_AH*smm_XH)*motion.smm_LBP*smm_NormalForce*cos(smm_RudderAngle);

    >

    >

    >

    > return smm_RudderNMoment;

    >

    > }

    >

    >

    >

    > void CRudder::Steer()

    >

    > {

    >

    > smm_OrderRudderAngle = smm_OrderRudderAngleD*PI/180.0;

    >

    >

    >

    > smm_Dot_RudderAngle = (smm_OrderRudderAngle-smm_RudderAngle)/smm_TE;

    >

    >

    >

    > if(fabs(smm_Dot_RudderAngle) > smm_Dot_MaxRudderAngle)

    >

    > {

    >

    > if(smm_Dot_RudderAngle > 0.0) smm_Dot_RudderAngle = smm_Dot_MaxRudderAngle;

    >

    > else smm_Dot_RudderAngle = -smm_Dot_MaxRudderAngle;

    >

    > }

    >

    > }

    > ----------------------------------------------------------------------------------

    >

    > 이 부분중에서 제가 특히 이해가 안가는 부분은 생성자의 소멸자를 다루는건데요.

    > 위의 부분중에서 하나입니다.

    > double RudderNMoment(CMotion &motion,CPropeller &propeller);

    >

    > Motion.h의 Class를 델파이로 변환시에는

    > procedure RuddreNMoment(?) double;

    >

    > 그리고 Cpp문에서도

    > double CRudder::RudderNMoment(CMotion &motion,CPropeller &propeller)

    > 이렇게 정의하는 부분 있지요

    > 이걸 델파이의 한 Unit로 구성할때는 Class를 정의하는것과 함수를 참조하는것을 예를 들어서 갈켜주시면 감사하겠어요 그럼 수고하세요..

    >