访问负数的数组!

Mic*_*ick 14 c++ visual-studio-2008

我正在将一个非常庞大且非常古老的(25年!)程序从C转换为C++.

在其中有许多(非常非常多)的地方,我使用各种整数索引访问全局一维UBYTE数组.有时这个指数可能是负面的.

我有时候,但并非总是如此,陷入困境,并确保没有出错,但作为一个腰带和大括号的测量,我实际上遇到了麻烦,确保在阵列前面有另一块内存并用右边填充它这样的值,如果我不小心省略了陷阱负数条件,那么仍然会在数组访问中获取正确的答案.这实际上很多年都很好.

但是现在在C++下,似乎访问具有负数的数组的行为有所不同,现在我的程序运行得很糟糕.我修复了一个未处理的负数的情况,程序似乎工作正常,但我很紧张,我没有陷入所有的负数,可能会有问题.

所以现在我的问题是,在运行时,有没有办法检测任何访问具有负索引的数组的实例?如果有人能想出答案,我会留下深刻的印象.如果你非常肯定它不能以任何自动方式完成,那么告诉我这也是有价值的信息.

我应该补充一点,我不是一个真正的C++程序员(还).到目前为止,我所做的只是绝对最低限度(几乎没有)让程序在C++编译器下编译.因此,如果您的答案涉及花哨的"专家,C++解决方案",那么请尝试用一个音节的单词解释或给我一个链接,以便我可以查找它.

Jor*_*ans 26

你能用一个带有重载operator []的对象替换全局一维ubyte数组吗?使用int输入的绝对值可能会解决您的一些问题.

编辑:根据数组的使用模式(没有指针shenanigans),使用具有重载operator []的对象实际上对数组的用户完全透明,因此我的建议.

  • 就个人而言,我会抛出异常而不是使用绝对值.(早期失败,大声失败.使用索引的绝对值只会继续使用或多或少随机值的程序.) (5认同)

jal*_*alf 6

你知道指数的界限吗?

在Siyfion的回答下阅读评论,似乎在您的问题域中允许负指数,因此试图强制所有指数为正数是没有意义的.一个更好的解决方案是允许负指数而不破坏任何语言规则(你的C版本也做了btw.你很幸运它没有爆炸;))

因此,如果您知道要使用的索引在-x到y的范围内,只需创建一个大小为x + y的数组,并在访问该数组时使用指向第x个元素的指针.

例如,假设您需要一个索引为-4到5的数组:

int arr[10];
int* ptr = arr+4;
// use ptr when you need to index into the array:

ptr[-4]; // is valid, reads arr[0]
ptr[5]; // is valid, reads arr[9]
Run Code Online (Sandbox Code Playgroud)

当然也可以(而且应该)用C完成.

另一条建议是不直接访问原始数组.改为定义简单的访问器功能.(例如,但不一定,通过将数组放在一个类中.如果你把它放在一个类中,你可以重载operator [],所以它甚至看起来像一个数组)

这个开销恰好为零(不是"接近零,或者接近于零,你不会注意到差异",但是为零.生成的代码与你直接访问数组的代码完全相同),因为编译器将内联短函数,但它还允许您插入额外的检查,以便您可以在调试版本中验证您永远不会超过数组的边界.