/* 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)
。我已经尝试了所有我能想到的东西,没有运气就摆脱它。有人可以帮忙吗?
答案 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[])
{
// ......
}
请注意,数组大小(即可选,实际上编译器不会考虑它)因为数组衰减到指针。这就是为什么通常将数组大小作为参数发送给函数的原因,这是一个很好的做法。