2011-03-09 4 views
2
/* 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

あなたはとしての機能を宣言:

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>を使用した方が簡単ですが、それは別の話です。

そこにはたくさんのことがあります。それが役に立てば幸い。


編集あなたがfloatの配列を期待される機能にdoubleの配列を渡すしようとしていることにだけ、別の問題に気づきました! 1つを選び、それに固執する。

+0

私はあなたがそれがうまくいって好きな宣言を修正しました!あなたはこれを一日中見つけようとしてくれてありがとう、ありがとう! – kalib

+0

@kalib:問題ありません。この記事は、配列を関数に渡す際の問題の説明に役立つことを願っています。 –

0

エラーはあなたが注意した通りです - writeitは浮動小数点数の配列へのポインタを期待していますが、これは異なるサイズのdouble型の配列に渡そうとしています。最も簡単な修正は、writeitのargsをdouble型の配列に宣言することで、一致するようにすることです。それを避けるには、渡す前にフロートの配列にコピーする必要があります(コピーするごとに各要素を変換します)

0

関数のプロトタイプは関数の定義とは異なります。だから、それを変更する -

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

と関数定義に - 配列サイズは(すなわち、オプション、実際にはコンパイラがそれを考慮しない)ことを

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

お知らせ配列はに減衰するため、ポインタ。通常、配列のサイズも関数の引数として送信されるため、これが良い方法です。

+0

「機能署名」。 "メソッド"はC++では明確に定義されていません。 :) –

+0

@Tomalak Geret'kal - あなたは正しいです。通常、* method *という用語はメンバ関数に使用されています:) – Mahesh

+0

より広いOO世界では、確かにC++ではうまく定義されていません。 「メンバー関数」はあまりにも曖昧です。 :)最高の避けるために。 –