2012-03-08 48 views
2

最近我想将一些代码从opencv转换为c#。但我在C++中声明动态数组时遇到了一些问题。将C++代码转换为c#声明数组

int* memorySteps = 0; 
CV_CALL(memorySteps = new int [ 10*sizeof(memorySteps[0]) ]);  

我想将它转换为普通的c#int数组。问题是长度。在C++中,上面的声明似乎是编译器将创建一个包含40个int元素的数组(size of memorySteps [0]的大小为4,长度为4个字节)。我的理解是否正确?然而,它没有任何意义,因为实际上在算法中我只需要一个10个int元素的数组。因此,谁能给我一个提示这是正确的以下(在C#),或任何人都可以告诉我其他的例子:

int[] memorySteps =new int [10*sizeof(int)]; 

int[] memorySteps =new int [10]; 
+0

欢迎来到寻找别人代码中的错误的奇妙世界! – dasblinkenlight 2012-03-08 14:41:40

+2

是的,那C++代码没有意义。 – 2012-03-08 14:42:09

回答

2

你的理解是正确的; C++版本将创建一个由40个整数组成的数组,假设为sizeof(int)==4。这可能是作者混淆了C的malloc,它以字节为单位。

因此,您的第一个版本会给出相同的行为,第二个版本更有可能会给出预期的行为 - 但存在一个危险,即超大缓冲区隐藏了其他错误,如果您减少可能会突然暴露其他错误尺寸。

+0

我写了一个循环来检查动态数组的长度。 'for(int n = 0; memorySteps [n]; ++ n){}'。 n的结果应该是(以我的理解)40,但它返回44的结果。它真的让我困惑。 – fskking 2012-03-08 14:51:21

2

如果算法需要十个项目,然后用

int[] memorySteps =new int [10]; 

我怀疑C++代码本身是由C代码,其中程序员称为malloc移植,像这样:

memorySteps = malloc(10*sizeof(memorySteps[0])); 

将该代码转换为C++的人可能已经忘记取消乘法器。这导致了一个功能正确,但有点内存效率低下的代码(尽管现在浪费了30个字节,这些日子甚至算不上低效率)。

0

你需要的是:

int[] steps = new int [10];