2011-11-01 2 views
8

I는 C#으로 구성 형의 고정 된 크기 어레이를 선언 할 방법고정 크기 어레이

이 CS1663을 초래할 것이다
[StructLayout(LayoutKind.Sequential,Pack=1), Serializable] 
public unsafe struct MyStruct{ 
    ... 
} 

public class MyClass { 
    ... 
    public fixed MyStruct myStruct[256]; 
} 

: 구조체 타입의 고정 된 크기의 버퍼가 허용되지 않고, 어떻게 수행 이 문제를 해결하려면? C# 또는 "Managed Collection 데이터 구조"형식을 사용하지 않는 것이 좋습니다. 기본 C++에 자주 마샬링해야하므로

답변

9

double. 당신의 C#을하면해야한다는 것입니다 struct는 기본 데이터 유형만을 사용하며 C++의 네이티브 구조체와 완전히 같은 레이아웃을 가지고 있습니다. 수동 메모리를 사용하여 이러한 제한 사항을 해결할 수 있습니다. m 관리 및 안전하지 않은 코드. 보너스로 마샬링을 피함으로써 성능을 향상시킬 수 있습니다.

는 메모리를 할당 :

IntPtr arr = Marshal.AllocHGlobal (sizeof (MyStruct) * 256); 

이것은 기본적으로 malloc, 그래서 할당 된 메모리는 GC의 인식 밖에 있습니다.

IntPtr을 MyStruct[256] 인 것처럼 네이티브 코드에 전달할 수 있으며 IntPtr 만 정렬되고, 가리키는 메모리가 아니라 마샬링됩니다. 기본 코드와 관리 코드는 동일한 메모리에 직접 액세스 할 수 있습니다. 당신이 기억을 완료하면 free에,

Marshal.FreeHGlobal (arr); 

하는 것을 잊지 마세요

static unsafe MyStruct GetMyStructAtIndex (IntPtr arr, int index) 
{ 
    MyStruct *ptr = ((MyStruct *)arr) + index; 
    return *ptr; 
} 

static unsafe void SetMyStructAtIndex (IntPtr arr, int index, MyStruct value) 
{ 
    MyStruct *ptr = ((MyStruct *)arr) + index; 
    *ptr = value; 
} 

: 읽으려면

는/C#을 포인터를 사용, C 번호와 배열의 구조체를 쓰기 그것.

3

수 없습니다. per the definition

유일한 제한은 배열 형식이 bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float, 또는

+0

해결 방법이 없습니까? 그래서 C++에서 이렇게 할 수 있습니까? – uray

+0

@uray 내가 제안 할 수있는 유일한 것은 정규 어레이입니다. 그게 가능하지 않다면 ... –