不能将`int *'转换为'float *'以使参数`1'变为`float mean(float *,float)'

时间:2011-08-11 05:00:48

标签: c++

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;

float mean (float num[], float n)
{
    int i;
    float sum=0;
    for(i=0;i<n;i++)
    sum=sum+num[i];
    return (sum/n);

}
int main()  
{

    int minusElements;  
    int n;
    cout << "Enter number of Elements:";  
    cin >> n;



    minusElements = n - 1  ;
    int i,j, num[n];  
    float  temp;

    float f;
    for(i=0;i<n;i++)  
    {
    cin >> f;
    num.push_back(f);
    }


    cout << "Enter " << n << " numbers:\n";
    for(i=0;i<n;i++)  
    cin >> num[i];
    cin.get();
    float m = mean(&num[0], num.size());


}  

//33 request for member `push_back' in `num', which is of non-class type `int[((unsigned int)((int)n))]' 

//41 request for member `size' in `num', which is of non-class type `int[((unsigned int)((int)n))]' 

3 个答案:

答案 0 :(得分:5)

第一件事:

 int num[numElements];  

标准C ++中不允许这样做。其可变长度数组(VLA),因为numElements不是const表达式。 VLA仅允许在C99中使用。


cout << "Mean:"<< mean(num,n);

mean()需要float*,但num的类型为int[],可以转换为int*,但不能转换为float*。因此错误。

解决方案是:在C ++中,使用std::vector<float>

#include <vector> //must include this!

std::vector<float> num;

float f;
for(i=0;i<numElements;i++)  
{
  cin >> f;
  num.push_back(f);
}

//then call mean() as
float m = mean(&num[0], num.size());

除此之外,您的mean()功能被错误地实施了。什么是numElements?它是一个未初始化的变量,您在for循环中使用它。这会调用undefined-behavior。解决方案是:您不需要numElements开头。只需使用传递给函数的n作为参数。


此外,在C ++中,您甚至不需要函数来计算均值,您可以使用<numeric>中的函数作为:

#include <numeric>

//if num is std::vector
float mean = std::accumulate(num.begin(), num.end(), 0) / num.size();

//if num is float[n] or float* (num of elements = n)
float mean = std::accumulate(num, num + n, 0) / n;

好的。既然你是初学者,想学习如何解决这个问题。在你尝试了自己不起作用之后,所以你应该如何做到这一点:

C ++中的C风格编码:

#include <iostream>

float mean (float *num, int n)
{
    float sum = 0;
    for(int i = 0 ; i < n ; i++ )
          sum += num[i];
    return sum/n; 
}
int main()  
{
    int count; 
    std::cin >> count;
    float *numbers = new float[count]; //allocate memory!

    for(int i=0; i< count ;i++)  
    {
       std::cin >> numbers[i];
    }
    std::cout << mean(numbers, count) << std::endl;
    delete [] numbers; //must deallocate the memory!
}

输入(下一行元素后跟的元素数量):

6
12 89 23 12 32 11

输出:

29.8333

在线演示:http://www.ideone.com/hdZPd

注意不建议使用C ++中的C风格编码,但仅限于学习目的。


C ++中的C ++样式编码:

#include <iostream>
#include <vector>
#include <numeric>

int main()  
{
    int count; 
    std::cin >> count;
    std::vector<float> numbers(count);

    for(int i=0; i< count ;i++)  
    {
       std::cin >> numbers[i];
    }
    float mean = std::accumulate(numbers.begin(), numbers.end(), 0.0)/ numbers.size();
    std::cout << mean << std::endl;
}

输入(下一行元素后跟的元素数量):

6
12 89 23 12 32 11

输出:

29.8333

在线演示:http://www.ideone.com/aZ7u8

希望它能帮助您理解这两种风格的问题和解决方案。

答案 1 :(得分:1)

根据这个问题的标题,我很确定你的问题在于这一行:

int num[numElements], i,j,temp;

你的意思是:

int i,j;
// shouldn't be using num[numElements] in c++ (see Nawaz's answer for why)
float num[], temp; // temp *also* should be a fload based on usage.

您似乎还有一个额外的for(i=0;i<numElements;i++)

答案 2 :(得分:0)

将int num [numElements]更改为float num [numElements]?您正在向需要浮点数组的内容发送一组int。