проблема с кодом ошибки - PullRequest
2 голосов
/ 09 марта 2011
/* 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 ]

3 голосов
/ 09 марта 2011

Вы объявили функцию как:

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! Выберите один и придерживайтесь его.

0 голосов
/ 09 марта 2011

Прототип функции отличается от определения функции. Итак, измените его на -

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

И определение функции до -

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

Обратите внимание, что размер массива (т. Е. Необязательный, фактически компилятор не учитывает его), поскольку массив распадается на указатель. По этой причине обычно размер массива также отправляется в качестве аргумента функциям, и это хорошая практика.

0 голосов
/ 09 марта 2011

Ошибка в точности, как вы заметили - writeit ожидает указатель на массив с плавающей точкой, и вы пытаетесь передать ему массив значений типа double, которые имеют другой размер.Самым простым решением было бы объявить аргументы writeit массивами значений типа double, чтобы они совпадали.За исключением этого, вам нужно скопировать в массивы с плавающей точкой перед передачей (конвертируя каждый элемент при копировании)

...