为什么此代码显示"cannot convert 'double' to 'double*'"错误?
Why does this code show the "cannot convert 'double' to 'double*'" error?
考虑以下代码:
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])
上,它不断给出错误
无法将参数"1"的"double"转换为"double*"以将其转换为"double-dist(double*,double*)"
这不是将数组传递给函数的方式:
for (i = 0; i < n; i++) {
dist(x[i], y[i]);
}
您可能认为您使用一个包含x[0..n-1]
中所有值的数组调用了函数dist
一次(对于y
也是如此)。事实并非如此。由于您处于循环中,您调用函数的次数与循环运行的次数一样多,在本例中为n
次。
此外,作为参数传递给函数的值是double
类型的元素。它不是您认为要提供的阵列。
我知道这个错误信息看起来很奇怪。"double*
从哪里来?"你可能会问自己。答案很简单:
数组不能传递给函数
由于所谓的"类型衰减",数组在表达式中使用时会转换为指向其第一个元素(基地址)的指针。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个元素的数组,因为当数组衰减到一个指针时,它们的类型完全匹配。有几种方法可以解决这个问题:
- 使参数成为函数的引用/指针
- 使用标准库数组类
现在,指针和引用是两种不同的东西,但它们仍然可以用来解决这个问题。使用对数组的引用与实际传入数组本身不同。引用充当对象的别名,它们基本上是一个隐藏的指针,只有少数例外(请参阅提供的链接)。然而,对于我们的例子来说,一个参考就足够了,下面是它的样子:
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);
您的dist
函数已经循环了3次。你可能想去掉main()
中的循环
cin>>n;
dist(x,y);
return 0;
这样,x和y都是double*
只是猜测你的意图,通过
只需调用
dist(x, y);
实际上,您传递的是来自数组的双值,而不是数组本身。
- "error: no matching function for call to"构造函数错误
- vector<vector<double>> to mxArray using memcpy
- 使用词法强制转换在'string to double'中设置双精度变量的精度
- "Cannot convert parameter 1 from double to float"虽然没有更改参数
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- C++ 错误"undefined reference to GPScoord::(double,double) etc."
- Converting Eigen::SparseMatrix<double> to deal.ii ::Sp
- Casting from (long)double to size_t
- 我越来越"invalid conversion from `void*` to `std::complex<double>*"
- 了解错误"error: cannot convert ‘char**’ to ‘const char*’ for argument ‘1’ to ‘double atof(const char*)’"
- 在函数 c/c++ 中传递指针时出错"double** to double*"
- 将 double 分配给 const int&vs int to const int&
- C++ winapi LONG to std double
- 编译程序时出错C++:"error: cast from ‘double*’ to ‘int’ loses precision"
- 为什么此代码显示"cannot convert 'double' to 'double*'"错误?
- C++ MFC double to CString
- Round Double and Cast to String
- Double to Const Char*
- reinterpret_cast - double to char[] to double not working -
- How to #define call(Double X) to func2(double X)