2017-11-07 4 views
-1

以下のプログラムは、作成されたオブジェクトの年齢から標準偏差を計算しようとしています。 Person型。エラー: 'Person *'を '倍精度浮動小数点数'に変換できません 'double stdDev(double *、int)'

ローカルマシンと学校サーバーで実行しようとすると、プログラムはうまく動作します。しかし、私の学校がテストに使用しているウェブサイト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; 

} 
+2

'pow(sampleVariance、1/2);' - その2番目の議論は、あなたが思うことをするつもりはありません。 'int'を' int'で割ったものは 'int'を与えます。 – PaulMcKenzie

+0

'stdDev'は2つ以上の要素を扱えると期待されています。 – molbdnilo

+0

また、ソースコードの* compilation *とコンパイルされた実行可能ファイルの実行*を区別する習慣を身につけてください。 C++コードは、PythonやBashコードと同じ意味で*実行されません。 – iksemyonov

答えて

0

:提供されたコードが十分に形成されています。正しくコンパイルされますが、<cmath>からのpow()の使用に間違いが1つありますが、計算結果が正しくない場合があります。この問題は、おそらくコードがテストシステムに適合したときに発生します。正しさの

証明:

http://coliru.stacked-crooked.com/a/7dde4667ad6aecb8

How would I begin to resolve this issue?

まず、あなたは、エラーメッセージを理解する必要があります。

Error: Cannot Convert ‘Person*’ To ‘double*’ For Argument ‘1’ to ‘Double stdDev(double[], int)’

これは署名double stdDev(Person*, int)を持つ関数があることを意味します。しかし、そのような関数を呼び出すコードはありません。行double a = stdDev(people, ARRAY_SIZE);にはstdDev(double*, int)の呼び出しがあります。つまり、誤った呼び出しは他の場所から発生しますが、関数はのに定義されていません。これは、見えない、おそらくテストシステムによって提供される追加のコードがあることを意味します。

もう1つの可能性は、修正を加えたコードのコピーがあなたの注意を逃されていることです。修正ではなく

double people[2]; 
double a = stdDev(people, ARRAY_SIZE); 

のあなたが行うことです。

Person people[2]; 
double a = stdDev(people, ARRAY_SIZE); 

これは明白な理由のためにエラーをトリガします。コードをリファクタリングしている場合は、関数呼び出しの行を更新するのを忘れている可能性が非常に高いです。コードを注意深く再確認してください。

What am I missing, or not understanding?

作業手順をよくお読みください。整形式のテストシステムには、の入出力形式の完全な説明が含まれている必要があります。​​関数は、入力形式に応じてPerson[]になるはずです。


設けコード内の1つの誤りがある:

double sampleStandardDeviation = pow(sampleVariance, 1/2); 

1/2は、2つの整数を分割しても整数を返す式、すなわち「整数除算」です。整数部は商を返します。この場合の商は0です。つまり、0の指数でpow()と呼んでおり、常に1を返します。この問題を解決するには2つの一般的な方法があります。

  • は、明示的に浮動小数点型へのオペランドの一方をキャスト:(double)1/2 - このアプローチは、オペランドが式
  • は浮動を指定してある意味場合になります.0または.を追加することによってリテラルポイント:

    When I attempt to run it on my local machine

    1.0/2

はちょうどあなたが理解してくださいします: C++はコンパイルされた言語です(C言語と同様)。ソースコードは、まずマシン(バイナリ)コードにコンパイルされ、実行可能ファイルはOSによって実行されます。コンパイル(または「ビルド」)と実行は、C++プログラムの実行の2つの明確に、しかし同様に重要なフェーズです。

関連する問題