我在尝试将以下代码从C语言移植到C#时遇到问题。使用fixed关键字和重新分配的ptr没有太大成功。有人能告诉我如何在c#中表示以下代码吗?
p = &table[(i = start[k]) >> m];
i <<= tablebits;
n = k - tablebits;
/* make tree (n length) */
while (--n >= 0) {
if (*p == 0) {
right[avail] = left[avail] = 0;
*p = avail++;
}
if (i & 0x8000) p = &right[*p];
else p = &left[*p];
i <<= 1;
}
*p = j;
答案 0 :(得分:2)
这里不使用指针(C#safe)......
var[] curtable = table;
i = start[k];
int idx = i >> m;
i <<= tablebits;
n = k - tablebits;
/* make tree (n length) */
while (--n >= 0)
{
if (curtable[idx] == 0)
{
right[avail] = left[avail] = 0;
curtable[idx] = avail++;
}
if (i & 0x8000)
{
idx = curtable[idx];
curtable = right;
}
else
{
idx = curtable[idx];
curtable = left;
}
i <<= 1;
}
curtable[idx] = j;
答案 1 :(得分:0)
看起来我能够通过为每个表使用固定指针来解决问题,然后是一个可以分配适当的固定指针的可更改的ptr。编译正常,代码似乎与c代码的结果相同。
fixed(ushort* p = &table[(i = start[k]) >> m])
{
ushort* p4 = p;
i <<= tablebits;
n = k - tablebits;
/* make tree (n length) */
while (--n >= 0)
{
if (*p == 0)
{
right[avail] = left[avail] = 0;
*p = (ushort)avail++;
}
if ((i & 0x8000) > 0) fixed(ushort* p2 = &right[*p4]) {p4 = p2;}
else fixed (ushort* p3 = &left[*p4]) { p4 = p3; }
i <<= 1;
}
*p4 = (ushort)j;
}