我正在研究的书中有一个与C ++有关的非常具体的问题。这本书叫做“使用C ++编程原理和实践”,作者是创建者本人。
我的问题基本上是,这本书要求您找到这个很小的程序中的严重错误(当然,出于练习目的),但是我不确定我发现的“错误”是错误还是甚至认为这是一个错误。
这是一小段代码:
create or replace function vwap(prices numeric[], volume integer[])
我发现的“错误”是您可以将两个随机内存地址传递给“高”函数,并且该函数无法正确执行。所以我的问题是我是对的还是我错过了其他东西?我仍在学习C ++和编程,因此这是对我的知识的帮助,我将不会从知识中获得其他任何东西。
编辑:正如一些用户所说,这是可怕的代码,但应该不难意识到这是作者的意图。该书的教学方法是使用更高级的技术将草率的代码慢慢地转变为更好的代码。
答案 0 :(得分:1)
最明显的错误是数组或向量的大小为零。 在这种情况下,函数的第一行首先返回,在取消引用时未定义。最好在first == last时返回last。对于数组和向量,这是定义明确的标准做法,但是您必须检查它,而不要取消对其的引用。
template<typename Iterator>
Iterator high(Iterator first, Iterator last)
{
if (first == last) return last;
Iterator high = first;
for (Iterator p = first; p != last; ++p) {
if (*high < *p) high = p;
}
return high;
}
对于零大小的矢量,此行是未定义的-您不能采用空矢量的零元素:
double* jill_high = high(&v[0], &v[0] + v.size());
应该是这样:
std::vector<double>::iterator jill_high = high(v.begin(), v.end());
然后,您必须检查数组的高位结果是否为jack_data + jack_count
,向量是否为v.end()
,因为您不能取消引用任何一个。相反,您可以打印“ N / A”或类似内容。
答案 1 :(得分:-1)
我发现的“错误”是您可以将两个随机内存地址传递到
high
函数中,并且该函数无法正确执行。
在这种情况下,您的期望是什么?
在C ++中,只有当指针引用同一数组的元素(包括指向最后一个元素的指针)时,指针比较才定义良好。否则,这是未定义的行为。对于未定义的行为,C ++标准不需要任何特定的行为,因此,未定义。