2017-11-16 5 views
1

참조 구조체 .. 안녕하세요. 구조체를 변환 할 수 있다면 좋겠다 C++ to C#? C++의 코드에서 볼 수 있듯이 새로운 구조에 3 개의 객체 배열이 포함되기를 바랍니다.Union 구조체 C# - 동치 또는 같음?</p> <pre><code>struct STRUCT_ITEM { short Index; union { short Value; struct { unsigned char Type; unsigned char Values; }; } Effect[3]; }; </code></pre> <p>안녕하세요 아래

은 다음과 같이 사용하는 것입니다 :

[FieldOffset(0)] 
    public short Index; 

    [FieldOffset(2)] 
    public short MountHP; 

    [FieldOffset(2)] 
    public byte EF1; 

    [FieldOffset(3)] 
    public byte EFV1; 

    [FieldOffset(4)] 
    public byte EF2; 

    [FieldOffset(5)] 
    public byte EFV2; 

    [FieldOffset(6)] 
    public byte EF3; 

    [FieldOffset(7)] 
    public byte EFV3; 

는이 구조의 배열을 포함 할 수 있습니다 :

var Item = new Item(); 

Item.Effect [2] .Type = 2; 

난 그냥 그런 식으로 얻을? 이 구조체에는 8 바이트의 최대 크기가 포함됩니다.

누가 도와 드릴 수 있습니까? 감사드립니다. 고마워요

+0

서식을 수정하려면 [편집]하십시오. 탭 문자를 사용하지 마십시오. 들여 쓰기에 공백을 사용하십시오. 편집하는 동안 제목에 넣지 말고 묻는 언어에 대한 태그를 추가하십시오. 태그 시스템은 여기에서 매우 잘 작동하며 도움이 필요하지 않습니다. 감사. –

답변

1

시도해보십시오. 예, 배열은 Sturcture에서 사용할 수 있습니다.

[StructLayout(LayoutKind.Explicit)] 
    public struct STRUCT_SUB_ITEM 
    { 
     [FieldOffset(0)] 
     public short Value; 
     [FieldOffset(0)] 
     public byte Type; 
     [FieldOffset(1)] 
     public byte Values; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct STRUCT_ITEM 
    { 
     short index; 
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] 
     public STRUCT_SUB_ITEM[] Effect; 
    } 

및 테스트

static void test3() 
    { 
     STRUCT_ITEM item = new STRUCT_ITEM(); 
     item.Effect = new STRUCT_SUB_ITEM[3]; 

     item.Effect[0].Type = 1; 
     item.Effect[0].Values = 2; 

     item.Effect[1].Type = 1; 
     item.Effect[1].Values = 2; 

     item.Effect[2].Type = 1; 
     item.Effect[2].Values = 2; 

     Console.WriteLine(item.Effect[2].Value); 
    } 

제한 유형 (bool, int, double, ...)이있는 배열 고정 키워드를 사용하면 메모리를 할당 할 필요가 없습니다.

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)] 
    public unsafe struct STRUCT_ITEM2 
    { 
     [FieldOffset(0)] 
     public fixed byte item_01[260]; 
    } 
+0

당신은 대략적인 접근 방식을 가지고 있습니다. 선언문에서 노조를 들어 올리면됩니다. 인덱스 필드는 잊어 버렸지 만 그 중 '안전하지 않은'필드는 필요하지 않습니다. –

+0

저는 현재 이것을 배우고 있습니다. 좋은 지적 주셔서 감사합니다. 그러나 소스, 고정 필드의 마지막 섹션에는 안전하지 않은 키워드가 필요했습니다. – Jake

+0

다음 번에는 아름다운 소스 코드와 관련하여 좋은 점 이외의 것을 기대합니다. – Jake

관련 문제