[英]Pointers, C++…code not working
这是一个问题:编写具有五个参数的minMax函数的定义。 前三个参数是整数。 该功能将后两个设置为前三个参数的最大值和最小值。 该函数不返回值。
该功能可以如下使用:
int a = 31, b = 5, c = 19, big, small;
minMax(a, b, c, &big, &small); /* big is now 31; small is now 5 */
这是我的代码:
void minMax(int x, int y, int z, int* big, int* small)
{
if (x < y && x < z)
*small = x;
else if (y < x && y < z)
*small = y;
else if (z < x && z < y)
*small = z;
if (x > y && x > z)
*big = x;
else if (y > x && y > z)
*big = y;
else if (z > x && z > y)
*big = z;
}
这是我得到的错误:
您的函数值未更改为small
。 确保在函数中取消引用它。
不知道出什么事了吗?
谢谢。
我看到一个迫在眉睫的问题。
你觉得当你通过数字会发生1
, 1
和7
?
也许您可能想考虑使用<=
和>=
而不是仅仅使用<
和>
。
由于该错误消息看起来与我之前见过的任何编译器错误都不一样(并且该代码在语法上有效),因此我建议该消息来自测试工具,该工具可能是:
big/small
值设置为传入的数字以外的数字(例如-9999
)。 1,1,7
)调用该函数。 此外,它不是世界上可读性最高的代码(无意冒犯)。 如果您能够以一种使代码意图一目了然的方式(包括适当的注释)来构造代码,则将有成群的未来程序员大声赞扬并崇拜您的名字:-)
这样的事情比else if
许多else if
构造更清楚地表明了它的意图(IMNSHO):
// Populate big/small based on max/min of x, y and z.
void minMax (int x, int y, int z, int *big, int *small) {
// Set by default to x, only change if others are bigger.
*big = x;
if (y > *big) *big = y;
if (z > *big) *big = z;
// Same for small but with reversed comparisons.
*small = x;
if (y < *small) *small = y;
if (z < *small) *small = z;
}
我不确定什么是行不通的。 看来这基本上可以工作,但结构可以更好。
也许是这样的:
void minMax(int x, int y, int z, int* big, int* small)
{
*big = *small = x;
if (y > *big)
*big = y;
if (y < *small)
*small = y;
if (z > *big)
*big = z;
if (z < *small)
*small = z;
}
错误讯息
您的函数值未更改为
small
。 确保在函数中取消引用它。
…似乎来自您的老师提供给您的测试装置。
无论如何,这是正确的:您可以选择一些值,在这些值中函数不会为*small
分配任何内容。
例如,如果a
, b
和c
的值相同 ,则您的函数将什么也不做。
无论如何,
对于以后的问题,请提供一个完整的示例程序来演示该问题。
这样人们就不必猜测和使用不可靠的心灵感应。
另外,分配要求您实现签名不正确的功能。
它教导了Bad Way™设计功能。
这是可能的普通C ++函数签名:
void getMinAndMax( int& smallest, int& largest, int a, int b, int c )
这是现代C ++技术的一个更好的签名:
std::pair<int, int> minAndMax( int a, int b, int c )
后一个函数的名称没有get
前缀是因为它是一个面向表达式的函数,如sin
和cos
(您不会写getSin
或getCos
,对吗?),而第一个函数的前缀是存在的只是为了使该名称成为必需,以反映它不是面向表达式的函数,而是一个面向动作的函数。
当然,对于C ++ 11,可以让函数接受任意数量的参数。 除了在我撰写本文时,Visual C ++尚未正确支持。 例如,这是C ++ 11标准库中std::min
的签名:
template<class T, class Compare>
T min(initializer_list<T> t, Compare comp);
使用C ++ 03,可以通过接受模板类型的单个容器参数在某种程度上做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.