【问题标题】:Without using "fixed", how do I access values of an array within a struct?如果不使用“固定”,我如何访问结构中数组的值?
【发布时间】:2011-04-15 10:57:17
【问题描述】:

我在做 C++ --> C# 互操作的东西,我有一堆像俄罗斯套娃一样相互包含的结构。问题是这些“嵌套”之一采用固定长度数组的形式:

typedef struct tagBIRDREADING
{
    BIRDPOSITION    position;
    BIRDANGLES      angles;
    BIRDMATRIX      matrix;
    BIRDQUATERNION  quaternion;
    WORD            wButtons;
}
BIRDREADING;

typedef struct tagBIRDFRAME
{
    DWORD           dwTime;
    BIRDREADING     reading[BIRD_MAX_DEVICE_NUM + 1];
}
BIRDFRAME;

按照hallowed teachings of Eric Gunnerson,我在 C# 中执行了以下操作:

[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct BIRDREADING
{
    public BIRDPOSITION position;
    public BIRDANGLES angles;
    public BIRDMATRIX matrix;
    public BIRDQUATERNION quaternion;
    public ushort wButtons;
}

[StructLayout(LayoutKind.Sequential, Size = 127)]
public struct BIRDREADINGa
{
    public BIRDREADING reading;
}

public struct BIRDFRAME
{
    public uint dwTime;
    public BIRDREADINGa readings; 
}

我的问题是,我如何访问包含在 BIRDREADINGaBIRDFRAME 中的 BIRDREADING 的 127 个实例中的每一个?还是我犯了严重的错误?

【问题讨论】:

    标签: c# arrays pinvoke marshalling struct


    【解决方案1】:

    我想你只是想要这个:

    [StructLayout(LayoutKind.Sequential)]
    public struct BIRDFRAME
    {
        public uint dwTime;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=127)] 
        public BIRDREADING[] readings; 
    }
    

    【讨论】:

    • 您的 P/Invoke 答案总是很快。每次我去提交一个,你的弹出:-]
    • @ildjarn 对不起!我确实喜欢 P/Invoke 问题,尽管我自己从未真正做过任何 P/Invoke。
    • 不需要道歉,只是表示恭维。 :-]
    • 感谢这个戴夫。我想知道你是否喜欢一个后续问题? stackoverflow.com/q/5681647/50151
    【解决方案2】:

    要在不使用数组的情况下访问所有这些实例,您需要使用不安全块来获取您设置的“假数组”的地址,然后使用指针算法。会变丑的:

    public struct BIRDREADINGa
    {
        public BIRDREADING reading;
    
        public BIRDREADING GetReading(int index)
        {
            unsafe
            {
                fixed(BIRDREADING* r = &reading)
                {
                    return *(r + index);
                }
            }
        }
    }
    

    【讨论】:

    • 嗯,显然更改值不会像这样readingA.GetReading(3).wButtons = 3 :(
    • 另外它使用固定的 OP 不想做的事情
    • @David:固定的不一样。我从聊天中知道他说的是fixed,意思是固定大小的数组,而不是fixed,意思是引脚引用。
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多