2015-10-25 76 views
0

我有一块C#代码表示这样负数组索引

digitsResPtr[-1] = digitsPtr[0] << rightShiftRev; 

其中digitsResPtrdigitsPtr是指向UInt32的阵列和rightShiftRev是整数。

我想知道这个德尔福表示法是否正确?

(digitsResPtr - 1)^ := digitsPtr[0] shl rightShiftRev; 

我的主要问题是负向索引。

谢谢。

德尔福XE7 UP 1.

+0

我们没有在阵列在C#中的负索引。除非你编写你自己的索引器。 –

+0

@ M.kazemAkhgary,谢谢你的回复,但记得我说digitsResPtr和digitsPtr是指向一组UInt32而不是数组本身的指针。 –

+0

@ Xor-el您的C#代码使用指针的原因是以某种方式实现自定义索引器。现在你主要关心的应该是你的数组如何存储在第一位。例如,如果您有基于零的数组(第一项具有索引0),那么尝试读取索引为-1的项实际上会导致读取超出数组范围的数据。因此,如果您启用了范围检查,最有可能会收到访问冲突错误或EOutOfBound错误。所以我建议非常小心。 ... – SilverWarior

回答

5

我认为这将是最干净的指针算法来做到这一点。例如

{$POINTERMATH ON} 
.... 
(digitsResPtr - 1)^ := digitsPtr[0] shl rightShiftRev; 

{$POINTERMATH ON} 
.... 
digitsResPtr[-1] := digitsPtr[0] shl rightShiftRev; 

我假设digitsResPtr在数组中键入^UInt32和点的地方。换句话说,你必须以某种方式或其他分配的数组,然后初始化digitsResPtr是这样的:

digitsResPtr := @digitsRes[5]; 
+0

我在我的BigInteger实现中有类似的代码。在那个代码中,'digitsResPtr'的等价物是一个运行指针(一个'PUInt32')到一个'UInt32'的数组中。 –