数组相关错误 - 无效类型..?

时间:2016-02-06 07:22:51

标签: c++ arrays

我正在制作一个与数组相关的简单程序。我的代码:

#include <iostream>
#include <cmath>
using namespace std;

int main() {
int a;
cout << "Please enter the length of the array: " << endl;
cin >> a;
bool array[a];

for (int n = 0; n < a; n++) {
    array[n] = true;

}
array[0] = false;
array[1] = false;
for (int k = 2; k < a; k++) {
        if (array[k] == true){

    for (int i = 0; pow(k,2)+ i*k < a; i++) {
        array[ pow(k,2) + i * k] = false;

             }
        }

}

    for (int j = 0 ; j < a ; j++){
        if (array[j] == true){
        cout << j <<endl;
        }
    }

}

我在第

行收到错误
array[ pow(k,2) + i * k] = false;

它说

"Invalid Types"
||=== Build: Debug in Test (compiler: GNU GCC Compiler) ===|
C:\Users\Momo\Documents\CodeBlocks Projects\Test\main.cpp||In function 'int main()':|
C:\Users\Momo\Documents\CodeBlocks Projects\Test\main.cpp|21|error: invalid types 'bool [(((sizetype)(((ssizetype)a) + -1)) + 1)][__gnu_cxx::__promote_2<int, int, double, double>::__type {aka double}]' for array subscript|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

这是错误。我试图从Java切换到C ++。然而,这种错误对我来说是新的,因为我从未在Java中遇到过这样的错误。 你们男孩和女孩能帮我理解这意味着什么吗?我该怎么做才能解决它? 感谢。

4 个答案:

答案 0 :(得分:2)

使用man pow,您可以获得以下信息:

  double pow(double x, double y);

由此我们知道pow()返回double。但数组下标必须是size_t变量。因此,您可以将该行更改为:

array[ static_cast<size_t>(pow(k,2)) + i * k] = false;

答案 1 :(得分:2)

首先,这个:

bool array[a];

不是合法的C ++。您可能正在使用的是支持Variable Length Arrays的编译器。但同样,VLA不是标准的C ++。取而代之的是你可以使用:

#include <vector>
//...
std::vector<bool> a(n);

this also has issues,但就你的目的而言,这应该不是问题。

现在为此:

array[ pow(k,2) + i * k] = false;

错误如上所述。在C ++中,您不能使用double作为索引类型。 pow函数返回一个double,因此该表达式总计变为double

您只能对数组索引使用整数类型。如果您真的想要使用double作为类型,请执行以下操作:

  1. 创建自己的类并重载operator []以获取double
  2. 不太理想(请参阅下面的注意事项),您可以使用std::map<double, bool>。它与数组不同,但使用doubleoperator[ ]的语法看起来像“数组一样”。
  3. 对于第二个选项:

     #include <map>
     //...
     std::map<double, bool> array;
    

    然后您可以使用array[pow(k,2]] = false;等语法。但请谨慎使用[ ],因为对于map,如果operator [ ]中指定的值不存在,[ ]将创建新的键/数据条目。因此,您可能会冒险在ersatz数组中创建“漏洞”。

    但考虑到所有这些,将浮点值用作数组(或甚至std::map)索引(或密钥w.r.t a map)存在一个根本性的缺陷。缺点是浮点计算不精确 - 不同的编译器,编译器设置等在运行程序时会产生不同的结果。如果您使用一组选项进行编译,然后使用另一组选项进行重建,则索引可能是一次性的。

    另外,如果你说“如果pow(k,2)是一个整数,那么k怎么会出错?”好this link会表明你无法确定。

答案 2 :(得分:0)

欢迎!现在你已经进入了一个全新的世界,你正在用C ++编程。我将向您介绍C ++标准库(通常称为STL)(http://www.cplusplus.com以供参考)。对于您希望在日常生活中使用的大多数容器,您可能需要考虑标准库中的容器。

在此特定实例中,您无法像上面那样在运行时实例化数组。您不能使用在运行时确定的大小来实例化堆栈上的数组。您需要在堆上动态分配内存或只使用STL容器(建议std::vector<>)。这就是我编写代码的方式

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

int main() {
    int a;
    cout << "Please enter the length of the array: " << endl;
    cin >> a;
    vector<bool> array(a);

    for (int n = 0; n < a; n++) {
        array[n] = true;

    }
    array[0] = false;
    array[1] = false;

    for (int k = 2; k < a; k++) {
        if (array[k] == true){

            for (int i = 0; pow(k,2)+ i*k < a; i++) {
                array[ static_cast<size_t>(pow(k,2) + i * k) ] = false;
             }
        }
    }

    for (int j = 0 ; j < a ; j++){
        if (array[j] == true){
            cout << j <<endl;
        }
    }


    return 0;
}

在此解释更多。以下一行

std::vector<bool> array(n)

使用n元素初始化向量(为简单起见)。

有关矢量类的更多信息,请访问此处(http://www.cplusplus.com/reference/vector/vector/?kw=vector

答案 3 :(得分:0)

可以按照以下方式完成。

for (int i = 0; (pow(k,2) + (i*k)) < a; i++) {
    int kk = (pow(k,2) + (i*k));
    array[kk] = false;

/ *这是因为pow()返回双倍,          double + int = double我们正在考虑将double作为数组的索引,这在标准中是不允许的。* /