有错误代码的麻烦

时间:2011-03-09 17:02:20

标签: c++ floating-point

/* This program */

using namespace std;

#include <iostream>
#include <cmath>
#include <iomanip>
#include <fstream>

void readit();
void calcit(int, int);
void writeit(float, float, float);
int distvels[4] = {15, 25, 35, 45};

int main()
{
    readit();
    system("pause");
    return 0;
}

void readit()
{
     int targetdist, angl;

     cout << "Enter the distance (meters) to the target:" << endl;
     cin >> targetdist;
     cout << "Enter the angle to fire the cannon:" << endl;
     cin >> angl;
     cout << "\n---------------\n\n";
     calcit (targetdist, angl);
}

void calcit(int targetdist, int angl)
{
     double distvals[4];
     double tyme[4];
     double maxhite[4];

     for (int i=0; i<4; i++) {
         distvals[i] = (2 * sin(angl) * cos(angl) * (distvels[i] * distvels[i]))/9.8;
         tyme[i] = (2 * cos(angl) * distvels[i])/9.8;
         maxhite[i] = ((cos(angl) * cos(angl)) * (distvels[i] * distvels[i]))/9.8;
     }

     writeit(distvals, tyme, maxhite);     
}

void writeit(float distvals[4], float tyme[4], float maxhite[4])
{
     cout << "Velocity       " << "time      " << "height     " << "distance    " <<endl;
     for (int i=0; i<4; i++) {
         cout << distvals[i] << " " << tyme[i] << " " << maxhite[i] << " " << endl;
}

每当我运行程序时,我都会收到此错误代码cannot convert double* to float for argument 1 to void writeit(float, float, float)。我已经尝试了所有我能想到的东西,没有运气就摆脱它。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

您将该函数声明为:

void writeit(float, float, float);

但定义如下:

void writeit(float distvals[4], float tyme[4], float maxhite[4])
{
    // ...
}

修复声明以匹配:

void writeit(float[4], float[4], float[4]);

在这个时刻也值得指出,这不符合你的想法。事实上,它与此相同:

void writeit(float[], float[], float[]);

与此相同:

void writeit(float*, float*, float*);

那是因为你不能按值传递一个数组,所以它会降级为一个指向该数组的指针。

但是,您可以通过引用传递它并保留尺寸:

void writeit(float (&)[4], float (&)[4], float (&)[4]); // declaration
void writeit(float (&distvals)[4], float (&tyme)[4], float (&maxhite)[4]) // definition
{
    // ...
}

我甚至建议将它作为引用传递给const,因为你不会改变它:

void writeit(float (&)[4], float (&)[4], float (&)[4]);
void writeit(const float (&distvals)[4], const float (&tyme)[4], const float (&maxhite)[4])
{
    // ...
}

如果您使用std::vector<float>也会更容易,但这是另一个讨论。

充分思考那里;希望它有所帮助。


编辑刚刚发现了另一个问题,因为您正在尝试将double数组传递给期望数组float的函数!选择一个并坚持下去。

答案 1 :(得分:0)

错误正如您所注意到的那样 - writeit期望指向浮点数组的指针,并且您正在尝试传递一个双精度数组,这是一个不同的大小。最简单的解决方法是将writeit的args声明为双精度数组,因此它们匹配。除此之外,您需要在传递之前复制到浮点数组(在复制时转换每个元素)

答案 2 :(得分:0)

函数原型与函数定义不同。所以,将其更改为 -

 void writeit(double*, double*, double*);

功能定义为 -

void writeit(double distvals[], double tyme[], double maxhite[])
{
     // ......
}

请注意,数组大小(即可选,实际上编译器不会考虑它)因为数组衰减到指针。这就是为什么通常将数组大小作为参数发送给函数的原因,这是一个很好的做法。