我的程序正在尝试计算从提供给Person类型的已创建对象的年龄的标准偏差。
当我尝试在本地计算机和学校服务器上运行它时,程序运行正常。但是,当我通过我的学校用来测试的网站Mimir运行时,我收到以下错误消息:
错误:无法将'Person *'转换为'double *'以将参数'1'转换为'Double stdDev(double *,int)'
我将如何开始解决此问题?我错过了什么,或者不理解?
Person.hpp
/*********************************************************************
** Author: Stephen Boles
** Date: 11.5.17
** Description: Assignment 6: Person
*********************************************************************/
#ifndef PERSON_HPP
#define PERSON_HPP
#include <iostream>
using std::string;
class Person
{
private:
string name;
double age;
public:
Person(string, double);
string getName();
double getAge();
};
#endif
Person.cpp
/*********************************************************************
** Author: Stephen Boles
** Date: 11.5.17
** Description: Assignment 7b: Standard Age
*********************************************************************/
//Include team Header.
#include "Person.hpp"
#include <iostream>
using std::cout;
using std::endl;
using std::string;
Person::Person(string x, double y)
{
name = x;
age = y;
}
string Person::getName()
{
return name;
}
double Person::getAge()
{
return age;
}
stdDev.cpp
/*********************************************************************
** Author: Stephen Boles
** Date: 11.5.17
** Description: Assignment 7b: BPerson
*********************************************************************/
// Include input/output stream and Team header.
#include <iostream>
#include "Person.hpp"
#include <cmath>
// Include standard namepaces
using std::cout;
using std::endl;
using std::string;
double stdDev(double arr[] , int size );
int main()
{
const int ARRAY_SIZE = 2;
double people[2];
Person p1("Boris", 23);
Person p2("Malenko", 25);
people[0] = p1.getAge();
people[1] = p2.getAge();
double a = stdDev(people, ARRAY_SIZE);
cout << a << endl;
return 0;
}
double stdDev( double arr[], int size)
{
int dataPointMean = 0;
int mean = (arr[0]+arr[1])/size;
for (int i = 0; i<size; i++)
{
dataPointMean += (pow ((arr[i] - mean), 2));
}
int sampleVariance = dataPointMean/2;
double sampleStandardDeviation = pow(sampleVariance, 1/2);
cout << sampleStandardDeviation << endl;
return sampleStandardDeviation;
}
答案 0 :(得分:0)
简而言之:提供的代码格式正确。虽然从pow()
使用<cmath>
导致计算结果不正确(与您可能预期的结果不同),但是它编译正确。当您的代码符合测试系统时,问题很可能就出现了。
正确性证明:
http://coliru.stacked-crooked.com/a/7dde4667ad6aecb8
我将如何开始解决此问题?
首先,您需要了解错误消息:
错误:无法将'Person *'转换为'double *'将参数'1'转换为'Double stdDev(double [],int)'
这意味着有一个带有签名double stdDev(Person*, int)
的函数。但是,没有代码可以调用这样的函数。行stdDev(double*, int)
中只有double a = stdDev(people, ARRAY_SIZE);
的调用。这意味着错误的调用来自其他地方,但函数未在您的代码中定义 。这意味着您还可以看到其他代码,最有可能是由测试系统提供的。
另一种可能性是你有一个代码的副本,其中包含一个可以引起你注意的修改。修改是代替
double people[2];
double a = stdDev(people, ARRAY_SIZE);
你这样做:
Person people[2];
double a = stdDev(people, ARRAY_SIZE);
由于显而易见的原因,这会触发错误。如果您一直在重构代码,很可能您忘记更新函数调用行。仔细重新检查代码。
我错过了什么,或者不理解?
仔细阅读任务表述。格式良好的测试系统应包含输入和输出格式的完整描述。根据输入格式,您可能会发现stdDev()
函数应该Person[]
。
提供的代码中的一个错误是:
double sampleStandardDeviation = pow(sampleVariance, 1/2);
1/2
是一个表达式,它除了两个整数并返回一个整数,即&#34;整数除法&#34;。整数除法返回商,在这种情况下为0
。这意味着您以pow()
的指数调用0
,并且始终返回1
。解决此问题有两种常用方法:
(double)1/2
- 这种方法在操作数是表达式的情况下有意义.0
或.
来指定浮点文字:1.0/2
当我尝试在本地计算机上运行它时
只是为了确保你理解:C ++是一种编译语言(就像C语言一样)。源代码首先被编译成机器(二进制)代码,然后操作系统才运行可执行文件。编译(或#34;构建&#34;)和执行是C ++程序执行的两个截然不同但同样重要的阶段。