为什么此代码显示"无法转换' double'到'加倍*'"错误?

时间:2014-09-14 02:33:09

标签: c++

考虑以下代码:

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;

3 个答案:

答案 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;,当在表达式中使用数组时,数组将转换为指向其第一个元素(基地址)的指针。 distdist(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值,而不是数组本身。