错误:无法将'Person *'转换为'double *'以将参数'1'转换为'Double stdDev(double *,int)'

时间:2017-11-07 17:05:12

标签: c++

我的程序正在尝试计算从提供给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;

}

1 个答案:

答案 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 ++程序执行的两个截然不同但同样重要的阶段。