【问题标题】:'Cannot convert 'float' to 'float*' for argument '1''无法将参数'1'的'float'转换为'float*'
【发布时间】:2015-02-02 16:52:17
【问题描述】:

我是一名 ICT 学生,正在学习 C++,我觉得这很有趣。但是,在进行实验时,我想出了一些我自己无法解决的问题,也无法在网上找到。 这是代码:

    #include <iostream>

using namespace std;


float average(float array[10], float &average){
      int i = 0;

      for( i = 0; i != 10; i++ ){
                cout << "Vett ("<<i<<") = ";
                cin >> array[i];
                while(cin.fail())
                {
                              cin.clear();
                              cin.ignore();
                              system("Color 5C");
                              cout << "\nPlease insert a number: ";
                              cin >> array[i];
                }
                average = average + array[i];
                }
                average = average / 10;
                return array[10];
                return average;
                }

main(void){
           float vett[10], media;
           int i;
           char loop;

           vett[10] = 0;
           media = 0;


           do{
           system("cls");
           system("Color 00");
           cout<<"****************************************"<<endl;
           cout<<"***     INSER THE DATA TO COMPUTE    ***"<<endl;
           cout<<"****************************************\n"<<endl;

         /*  for( i = 0; i != 10; i++ ){
                cout << "Vett ("<<i<<") = ";
                cin >> vett[i];
                while(cin.fail())
                {
                              cin.clear();
                              cin.ignore();
                              system("Color 5C");
                              cout << "\nPlease insert a number: ";
                              cin >> vett[i];
                }
                media = media + vett[i];
                }

                media = media / 10;
                */
                average(vett[10],media);
                for( i = 0; i != 10; i++ ){
                     cout << vett[i]<<"  ";
                     }

                if(media == 0){
                         cout << "\nATTENTION the average equals to = "<<media<<endl;
                         }
                else{
                     cout << "\nThe average is"<<media<<endl;
                     }
                     printf("\n");
                     cout << "\nDo You want to continue? Y/N";
                     cin >> loop;
                     }
                     while(loop == 'Y' || loop == 'y');
                     system("pause");
                     }

由于某种原因,我无法在“平均”函数中将数组设置为指针 (&array),可能是因为数组已经是一个指针。尽管如此,删除它会给我以下错误:

"Cannot convert 'float' to 'float*' for argument '1' to 'float average(float*,float&)'

如果我这样调用函数

average(&vett[10],media);

它可以工作,但会在数组中返回奇怪的值。 如您所见,我评论了我在函数中放入的相同内容,它完美运行,除非..我将它放入函数中。我假设我在函数调用中做错了什么,有人可以帮助我理解吗?

【问题讨论】:

  • vett[10] = 0; 这会访问数组边界之外的内存并且不会执行您想要的操作。你想零初始化数组吗?在声明中使用float vett[10] = {0}
  • 前几天刚看到同样的问题。
  • return array[10]; return average; 你希望通过两次使用return 来完成什么?

标签: c++ arrays function pointers


【解决方案1】:

首先,请注意main(void){ 不是main 的有效签名。
应该是:

int main(void){

然后:

float vett[10];
vett[10] = 0;

这是无效的。数组索引从 0 开始,因此索引 10 超出范围,因为它需要一个大小为 11 的数组。

此外,由于您的 average 函数将浮点数组作为第一个参数,因此您需要以这种方式传递它:

average(vett,media);

使用:

average(&vett[10],media);

将传递一个指向位于数组后面的数据的指针,所以很明显你会得到垃圾值。

【讨论】:

    【解决方案2】:
    • 不要在 C++ 中使用func(void),它在某种程度上已被弃用。请改用func()
    • 如果您有float vett[10];,则vett[10] 无效。您只能使用vett[0 .. 9]
    • float average(float array[10], float &amp;average)
      实际上是指
      float average(float *array, float &amp;average).
      (第二种形式是更常见的声明指针参数的方式。)
      如果你想用vett作为参数调用它,只需使用@ 987654329@

      数组的名称在用作指针时会自动转换为指向数组第一个元素的指针。所以这里
      average(vett, media);
      vett 表示&amp;vett[0]

    【讨论】:

      【解决方案3】:

      方括号中的数字有两种含义:

      • 在像float vett[10]; 这样的声明中,它是数组的大小
      • 当不在声明中时,例如average(&amp;vett[10],media);,它表示数组的第十一个元素。

      average(&amp;vett[10],media); 将第十一个元素的地址传递给函数。该函数将其解释为数组的开头,这是错误的,并且在访问数组外的元素时会导致未定义的行为。

      因为要传递整个数组,所以应该使用

      average(vett,media);
      

      【讨论】:

      • 没有。 10 表示数组中的第 11 个元素。
      • 不。这是一个很好的理由!修改后已将其删除。
      • 谢谢,我完全同意。我不太擅长玩“西部最快的枪”......
      【解决方案4】:

      我会在帮助中添加更多内容...

      您的平均方法在其末尾有两个返回语句。永远不会到达最后一个(您想要的那个),因为该方法将返回第一个...

      【讨论】:

        【解决方案5】:

        在函数中而不是这个

        float average(float array[10], float &average){ 
        

        你必须把这个:

        float average(float *array, float &average){
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多