2013-01-09 4 views
-1

C#에서 SlimMath 매트릭스를 FLOAT *로 가능한 한 깨끗하게 관리해야합니다. 지금까지 나의 모든 시도는 더럽고 부서졌습니다.C# 매트릭스를 C++로 변환 FLOAT *

C#을

Matrix m = Matrix.Identity; 
//.......(transform matrix) 
//.......Convert it to something I can get into c++ ?? 
myManagedCPPFunction(m.ToArray()); 

C++

void myClass::myManagedCPPFunction(?? matTransform) 
{ 
    //FLOAT* f = reinterpret_cast<FLOAT*>(&matTransform); //Cant do this cause managed code 
    otherClass->Go((FLOAT*)matTransform); 
} 

//This is existing code I'm trying to get to: 
class otherClass 
{ 
public: 
virtual void STDMETHODCALLTYPE Go(const FLOAT *pTransformMatrix); 
} 

나는 그와 함께 작동 할 수있는 충분한 의미가 희망 : 코드는 다음과 같이 보인다.

감사합니다.

편집이 작업은 문자열 및 일반 수레에서 이미 작동하고 있음을 잊어 버렸습니다. float [] -> float * 일을 할 수없는 것 같습니다.

나는 이런 식으로 작업을 진행 할 수 있었다, 그러나 이상적이지의 :

unsafe 
{ 
    fixed (float* f = m.ToArray()) 
     myManagedCPPFunction(f); 
} 

는 분명한 이유 그렇게하지 않으시겠습니까. 내가 지금 일하고 있다고 생각

OK는 (적어도 그것과 실행을 컴파일하지만 지금은 변환과 재생해야) 다음과 같이 당신이 할 수있는 방법을

void myClass::myManagedCPPFunction(SlimDX::Matrix^ matTransform) 
{ 
    FLOAT* f = reinterpret_cast<FLOAT*>(&matTransform); 
    otherClass->Go(f); 
} 

답변

0

를이 같은 유형을 사용할 수 있습니다 ++ C를 관리 있다면 C# 에서처럼. 이유는 바로이 같은 C++ 방법을 선언하지 :

void myClass::myManagedCPPFunction(Matrix^ matTransform) 
+0

예, 좋습니다. 전에는 SlimDX :: Matrix ^를 사용해야한다는 것을 깨닫지 못했습니다. 감사! – FrozT

1

이가 C++로 선언이다 C 번호로 사용할 수 (p/invoke 튜토리얼 참조)

extern "C" { 
    __declspec(dllexport) void STDMETHODCALLTYPE Go(float* pMatrix); 

    void Go(float* pMatrix) { 
     // do your stuff here. assume the matrix has 16 elements 
    } 
} 

및 C#으로을 :

[DllImport("myDll.dll")] 
public static extern void Go(float[] matrix); 

샘플 C# 코드 :

Matrix m = myMatrix; 
Go(m.ToArray()); 

편집 : 당신이 C++/CLI는 어셈블리를 관리 사용하는 경우, 다음과 같은 기능을 선언 할 수 :

using namespace System; 

public ref class Class1 
{ 
    public: 

     void Go(array<float>^pFloat) 
     { 
      ... 
     } 
    }; 
+0

는 C++를면이 잘 컴파일하지만, C#은 말한다 : 은에서 변환 할 수 없습니다 '[] 부동' '플로트 *'로. DLLImport를 사용하지 않고 C# 솔루션 및 참조 용 C++ 프로젝트를 가지고 있습니다. – FrozT

+0

DllImport없이이 작업을 수행하는 방법은 무엇입니까? COM을하고 있습니까? –

+0

난 그냥 내 C# 솔루션에서 C++ 프로젝트를 누른 다음 두 가지를 연결하는 C# 프로젝트에서 참조를 추가합니다. 그 시점에서 C++ 래퍼 클래스의 함수를 C#에서 직접 호출 할 수 있습니다. System :: Runtime :: InteropServices를 사용한다고 생각합니다. 변환 행렬 부분을 제외하고는 모두 잘 작동합니다. – FrozT