我正在尝试将一些代码从C ++转换为C#,我不确定这两个语句是否相同。
C ++(来源):
float* df = new float[ length ] // length is a previously initialized int
int coefIND = 0;
do
{
float* const df2 = df + coefIND;
// some element reassignments such as df2[1] = x[...] * y[...];
coefIND += 4;
}
while(coefINF < length);
delete[] df; // this occurs much later though
C#(翻译?):
float[] df = new float[ length ]
int coefIND = 0;
do
{
Array.Copy(df, 0, df, coefIND, length);
// some element reassignments such as df[1] = x[...] * y[...];
coefIND += 4;
}
while(coefIND < length)
感谢您的帮助, 格雷格
答案 0 :(得分:2)
你还没有展示df2的C#定义,但最好的解决方案是将coefIND添加到代码体中的每个索引,而不是复制到临时数组(之后再返回)。与C ++不同,安全C#不允许存储指向数组内元素的指针。
答案 1 :(得分:1)
如果你迫切希望这样做,你可以使用linq。
df2 = df.Skip(coefIND).ToArray();
但是我相信在C ++中你假设浮点数的大小是4个字节(因此增量为4。
更好的循环实现就是;
for (var coefIND=0;coefIND<df.length;coefIND++) {
// some element reassignments such as df[coefIND] = x[...] * y[...];
}
你的代码在注释中提到了df [1],数组是零索引,所以你使用它的方式会在你的数组末尾访问内存。
答案 2 :(得分:0)
您提供的翻译效率非常低,因为它需要多次复制数组内容。 C ++中的表达式df[ x ]
等同于*(df + x)
,您可以将该转换应用于代码以获取:
float[] df = new float[ length ]
int coefIND = 0;
do
{
// some element reassignments such as:
df[ coefIND + 1] = x[... ] * y[...];
coefIND += 4;
}
while(coefIND < length);
请注意,在循环中的所有操作都被展开的情况下,您可能会有一些额外的添加(与C ++代码相比),但整体性能应该几乎相同。