数组下标'int [5][float]'的类型无效

Invalid types 'int [5][float]' for array subscript

本文关键字:类型 无效 float 下标 int 数组      更新时间:2023-10-16

这是我的全部代码(在C++中),以备不时之需。我用的是Eclipse开普勒。

//Tutorials from www.cplusplus.com/doc/tutorial combined
#include <iostream>
using namespace std;
//tutorial #1.1 Function with type -- Addition
int addition (int a, int b)
{
  int r;
  r=a+b;
  return (r);
}
//tutorial #1.2 Function with type -- Subtraction
int subtraction (int a, int b){
    int r;
    r=a-b;
    return (r);
}
//tutorial #1.3 Function with NO type
void printmessage (void)
{
  cout << "It's good to be the king." << 'n';
}
//tutorial #2.1 Arguments passed by reference
void duplicate (int& a, int& b, int& c)
{
  a*=2;
  b*=2;
  c*=2;
}
//tutorial #2.2 and 2.5 Arguments passed by value and Declaration of preferred inline function
inline void prevnext (int x, int& prev, int& next)
{
  prev = x-1;
  next = x+1;
}
//tutorial #2.3 Default values in parameters (functions)
int divide (int a, int b=2)
{
  int r;
  r=a/b;
  return (r);
}
//tutorial #2.4.1 Overloaded functions -- int cannot handle decimals
int operate (int a, int b)
{
  return (a*b);
}
//tutorial #2.4.2 Overloaded functions -- float is used with decimals
float operate (float a, float b)
{
  return (a/b);
}
//tutorial #2.6 Recursivity -- factorial calculator
long factorial (long a)
{
  if (a > 1)
   return (a * factorial (a-1));
  else
   return (1);
}
//tutorial #2.7 Declaring function prototypes
void odd (int a); //declared
void even (int a); //declared
void odd (int a) //defined
{
  if ((a%2)!=0) cout << "Number is odd.n";
  else even (a);
}
void even (int a) //defined
{
  if ((a%2)==0) cout << "Number is even.n";
  else odd (a);
}
//tutorial #3.1 Initializing and accessing the values of an array
float billy [] = {16, 2, 77, 40, 12071};
float k, result=0;
int main ()
{
    cout << "Name: My Name n";
    cout << "Homework: 1";
    cout << endl;
    cout << endl;
  int x=8, y=1, z, aa;
  float n=3.0,m=9.0;
  long number;
  z = addition (4,2);
  aa = subtraction (6,3);
    cout << "The sum is " << z << 'n';
    cout << "The subtraction is " << aa << 'n';
    cout << "The second subtraction is " << subtraction(x,y) << 'n';
  z = addition (x,y) - 3;
    cout << "The new sum is " << z << 'n';
  printmessage();
  duplicate (x,y,z);
    cout << "x=" << x << ", y=" << y << ", z=" << z << 'n';
  prevnext (x, y, z);
    cout << "Previous=" << y << ", Next=" << z;
    cout << endl;
    cout << "Division = " << divide (14);
    cout << endl;
    cout << "Second Division = " << divide (10,8);
    cout << endl;
    cout << "Operate Multiply: " << operate(x,y);
    cout << 'n';
    cout << "Operate Divide: " << operate(n,m);
    cout << endl;
    cout << "Please type a number: ";
      cin >> number;
      cout << number << "! = " << factorial (number);        
      cout << endl;
    int i;
      do {
        cout << "Type a number (type 0 to exit): ";
        cin >> i;
        odd (i);
      } while (i!=0);
      for ( k=0 ; k<5 ; k++ )
       {
          result += billy[k];
       }
       cout << result;
  return 0;
}

这是我编写的代码中主要存在问题的部分。更具体地说,结果+=billy[k]行抛出错误:

      for ( k=0 ; k<5 ; k++ )
       {
          result += billy[k];
       }
       cout << result;

这对应于:

//tutorial #3.1 Initializing and accessing the values of an array
float billy [] = {16, 2, 77, 40, 12071};
float k, result=0;

我需要帮助修复这段代码,但最重要的是,我想知道为什么我的代码会给我这个错误,以及我如何让它变得更好(在初级层面上——显然,我在这里没有实现高级概念)。

编辑11:10PM我忘了把它切换回int。我最初有int,但由于错误,我想我会尝试float,看看它是否有区别。

不能将浮点类型用作数组的索引。k应该是一个整数。

应该使用整数作为数组的索引。也就是说,将k声明为一个整数。

思考这个问题的一种方法是,如果您尝试billy[1.5]呢?这有意义吗?这应该返回第一个元素还是第二个元素,或者介于两者之间,或者什么都不返回?访问billy[1.5]没有意义,您应该将数组视为一组离散的值,并且索引应该只指向其中一个值。

float billy[] = {1.0, 2.0, 3.0, 4.0, 5.0};
float result = 0.0;
int k;
for (k = 0; k < 5; k++)
{
    result += billy[k];
}
cout << result << endl;

此外,除非您真的需要在程序中的任何位置访问resultbillyk,否则您应该考虑将它们移动到main函数内部。正如Neil Kirk在其中一条评论中所说,如果你的循环中只需要k,你可以写以下内容:

for (int k = 0; k < 5; k++)
{
    // Do Something
}

根据C++标准,数组索引必须是整数类型,您需要将变量k更改为整数类型。

§8.3.4阵列

在声明T D中,其中D的形式为

D1 [ constant-expressionopt] attribute-specifier-seqopt

如果声明T D1中的标识符类型为"派生声明符类型列表T",则D的标识符类型是数组类型;

如果存在常数表达式(5.19),则其应为积分常数表达式,且其值应大于零。常量表达式指定数组的绑定(中的元素数)。如果常量表达式的值为N,则数组具有编号为0到N-1的N个元素,并且D的标识符的类型为"N T的派生声明符类型列表数组"。

现在来看§5.19常数表达式

§5.19.4由于本国际标准对浮点运算的准确性,未指定翻译过程中对浮点表达式的求值是否与对同一表达式的求值结果相同