0

次のコードを 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;
4

2 に答える 2

2

ここでは、ポインターを使用しません (C# セーフ)...

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;
于 2013-10-12T02:43:15.520 に答える
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;
    }
于 2013-10-12T13:56:39.063 に答える