如何从结构中的固定缓冲区访问元素?

问题描述 投票:0回答:2

我正在尝试执行此操作,但是似乎没有任何内容分配给BoneIDsBoneWeights,在C#中执行此操作的正确方法是什么?

public unsafe struct VertexBoneData
{
    public Vector3 Position;
    public Vector3 Normal;
    public Vector2 TexCoord;
    public fixed float BoneIDs[Bone.MaxBoneCount];
    public fixed float BoneWeights[Bone.MaxBoneCount];

    public float GetBoneID(int i)
    {
        return BoneIDs[i];
    }

    public void SetBoneID(int i, float value)
    {
        BoneIDs[i] = value;
    }

    public float GetBoneWeight(int i)
    {
        return BoneWeights[i];
    }

    public void SetBoneWeight(int i, float value)
    {
         BoneWeights[i] = value;
    }
}
c# struct fixed unsafe
2个回答
0
投票

从广义上讲,您所拥有的很好(我个人将固定缓冲区设置为private,并在i上添加一些范围检查))。我强烈怀疑您实际上在这里使用的是按值传递语义,其中您正在操作值的[[隔离副本。这是一个完全可运行的演示,其类型为“原样”(无更改),显示一切正常:

using System; static class Program { static void Main() { VertexBoneData data = new VertexBoneData(); data.SetBoneID(3, 42F); Console.WriteLine(data.GetBoneID(3)); // writes 42 // here's what I *suspect* you're doing SomePassByValueMethod(data); Console.WriteLine(data.GetBoneID(3)); // still writes 42, not 16 // here's one way to fix that SomePassByReferenceMethod(ref data); Console.WriteLine(data.GetBoneID(3)); // writes 122 } static void SomePassByValueMethod(VertexBoneData data) { data.SetBoneID(3, 16F); } static void SomePassByReferenceMethod(ref VertexBoneData data) { data.SetBoneID(3, 122F); } } public unsafe struct VertexBoneData { public Vector3 Position; public Vector3 Normal; public Vector2 TexCoord; public fixed float BoneIDs[Bone.MaxBoneCount]; public fixed float BoneWeights[Bone.MaxBoneCount]; public float GetBoneID(int i) { return BoneIDs[i]; } public void SetBoneID(int i, float value) { BoneIDs[i] = value; } public float GetBoneWeight(int i) { return BoneWeights[i]; } public void SetBoneWeight(int i, float value) { BoneWeights[i] = value; } } static class Bone { public const int MaxBoneCount = 4; // whatever } // just avoiding a dependency here, since I'm in a console exe public readonly struct Vector3 { } public readonly struct Vector2 { }

-1
投票
使用法警技术

const int MaxBoneCount = 10; public struct VertexBoneData { public Vector3 Position; public Vector3 Normal; public Vector2 TexCoord; [MarshalAs(UnmanagedType.I4, SizeConst = MaxBoneCount)] public float BoneIDs[]; [MarshalAs(UnmanagedType.I4, SizeConst = MaxBoneCount)] public float BoneWeights[]; }

© www.soinside.com 2019 - 2024. All rights reserved.