考虑以下代码:
double dist(double x[3], double y[3])
{
double Sum;
double distance;
for(int i=0; i<3; i++)
{
cout << "Enter value of first coordinate";
cin >> x[i];
cout << "Enter value of second coordinate";
cin >> x[i];
Sum = Sum + pow((x[i] - x[i]), 2.0);
distance = (int)sqrt(Sum);
}
cout << "DISTANCE: " << distance;
return distance;
}
int main()
{
int i, n;
double x[3]; double y[3];
cout << "enter number of test case" << endl;
cin >> n;
for(i=0; i<n; i++)
{
dist(x[i], y[i]);
}
return 0;
}
在dist(x[i], y[i])
行上,它不断给出错误
无法转换&#39; double&#39;到&#39;加倍*&#39;争论&#39; 1&#39;到&#39; double dist(double *,double *)&#39;
答案 0 :(得分:2)
这不是将数组传递给函数的方式:
for (i = 0; i < n; i++) {
dist(x[i], y[i]);
}
您可能认为您使用包含dist
的所有值的数组(以及同样适用于x[0..n-1]
)调用函数y
一次。事实并非如此。由于您处于循环中,因此您将循环调用该函数的次数与循环次数相同,在这种情况下为n
次。
此外,作为参数传递给函数的值是double
类型的元素。它不是您认为提供的阵列。
我知道错误信息似乎很奇怪。 &#34; double*
来自何处?&#34;你可能问过自己。答案很简单:
无法将数组传递给函数。
由于某些名为&#34; type decay&#34;,当在表达式中使用数组时,数组将转换为指向其第一个元素(基地址)的指针。 dist
(dist(double x[3], double y[3]
)的参数类型与dist(double* x, double* y)
完全相同。这意味着当您错误地尝试将double
传递给函数时,编译器报告您无法将它们转换为指针。
传递数组的名称将传递指向第一个元素的指针。这将解决您的主要问题:
dist(x, y);
你仍然可以在指针上使用下标运算符x[n]
的原因是因为下标运算符是*(x + n)
的语法糖。也就是说,指针偏移n
加上取消引用,以便为您提供该地址的值。
此类型衰减还带来另一个问题:由于数组正在转换为指针,因此无法确定随其类型一起出现的大小信息。你可以有一个函数接受double[100]
并传递一个包含1个元素的数组,因为当数组衰减到指针时它们的类型完全匹配。有几种方法可以解决这个问题:
现在,a pointer and a reference are two different things,但它们仍可用于解决此问题。使用对数组的引用与实际传入数组本身不同。引用充当对象的别名,它们基本上是一个指针,但有一些例外(参见提供的链接)。对于我们的示例,引用已经足够了,但是,它的外观如下:
double dist(double (&x)[3], double (&y)[3]);
此处不会发生类型衰减,并且您有一个保证大小,因为如果传入任何其他大小的数组,编译器将报告错误。
参考是有用的,但它可能不适合第一次使用。幸运的是,标准库为我们提供了一个数组类std::array
。不需要奇怪的语法,它有一个更清晰的界面 - 没有指针!
#include <array>
double dist(std::array<double, 3> x, std::array<double, 3> y);
std::array<double, 3> x, y;
dist(x, y);
答案 1 :(得分:0)
您的dist
功能已循环3次。
你可能想摆脱main()
cin>>n;
dist(x,y);
return 0;
这样,x和y都是double*
虽然只是猜测你的意图
答案 2 :(得分:0)
致电
dist(x, y);
实际上,你是从数组中传递double值,而不是数组本身。