2016-01-07 35 views
0

我想阅读并写入VectorOfFloat的单个元素。问题在于没有定义setter,这使得括号+索引访问元素的方式成为只读。如何修改矢量的单个元素?

VectorOfFloat vector = new VectorOfFloat(5); 
// vector[2] = 2.5F; // does not work 

有一个变通方法:

  1. 转换到阵列ToArray()
  2. 根据需要
  3. 写入阵列回来Clear()Push()
float[] array = vector.ToArray(); 
array[2] = 2.5F; 
vector.Clear(); 
vector.Push(array); // does work but is retarded 

Console.WriteLine(vector[2]); 
修改阵列

这似乎是非常繁琐的只写一个元素有没有更直接的方法呢? 另外,如果我可以解决它,那么缺失的setter值多少?

+0

我不知道这是否是_safe_(但从OpenCV的执行点),但你可能只是'浮* PTR =(浮动*)vector.StartAddress.ToPointer();'一个'unsafe'上下文中你也可以直接写'ptr [2] = 2.5f;'。 –

+0

这似乎是一个非常尴尬的数据类型。为什么不使用std :: vector ? – GPPK

+0

'VectorOfFloat'提供了一个名为'Ptr'的'IntPtr'属性。使用它可以访问不安全代码块中的'foat *'指针引用。 – ja72

回答

1

评论无误。访问非管理阵列的方式是通过StartAddress属性返回IntPtr

lock(vector) 
{ 
    var ptr_array=(float*)vector.StartAddress.ToPointer(); 
    ptr_array[4]=1.0f;  
} 
+0

我是否正确理解这一点:我无法设置单个元素,因为它不安全,但是我可以将整个数据结构加以核实并将其替换为完全不同的内容并安全地执行此操作? – null

+0

您并未替换数据结构。 'VectorOfFloats'是一个非托管类型(C数组),您正在访问低杠杆内存操作的元素,绕过不允许您设置值的更高级索引。只要小心,不要坚持使用指针,并始终将它们保留在本地环境中(不要将它们从方法中返回)。 – ja72

+0

我在我的问题中发布了解决方法。 – null