我无法访问 C++ 中的全局数组

I can't access a global array in c++

你好,如果我的英语有错误,首先请原谅我,我是 c++ 的初学者,我需要帮助解决这个问题

//global variables
int RangeOfArray; 
int arr[RangeOfArray-1]; // error: array bound is not an integer constant before ']' token


void functionOne(){} // I need to access the array here.

void functionTwo(){} // as well here.


int main (){

 cout<<"Type the length number of the array  :  ";
 cin >> RangeOfArray;`

}

如您所见,我的程序中到处都需要数组 (arr),但我不能,为什么?我不知道

在这些声明中

//global variables
int RangeOfArray; 
int arr[RangeOfArray-1]; // error: array bound is not an integer constant before ']' token

声明了全局变量 RangeOfArray 隐式初始化为零,然后声明了可变长度数组 arr,大小 -1 隐式转换为由于通常的算术转换,类型 size_t 的最大值,因为在 C++ 中,在其声明中指定数组大小的表达式被转换为类型 size_t.

对于初学者来说,可变长度数组不是标准的 C++ 功能。此外,您不能声明具有静态存储持续时间的可变长度数组。

其次,使用表达式 -1 作为数组的大小没有任何意义。

如果您需要模拟数组的全局变量,请使用标准容器 std::vector<int>

例如

#include <iostream>
#include <vector>

//global variables
std::vector<int> arr;


void functionOne(){ /* ... */ } // I need to access the array here.

void functionTwo(){ /* ... */ } // as well here.


int main()
{
    size_t RangeOfArray;

    std::cout<<"Type the length number of the array  :  ";
    std::cin >> RangeOfArray;`

    arr.resize( RangeOfArray );
    //...
}

vector 提供成员函数size,报告当前存储在vector 中的元素数。所以你不需要使变量 RangeOfArray 全局。

注意使用全局变量不是一个好主意。

因此您可以在 main 中声明向量,并通过引用将其传递给需要它的函数。

why [I cannot use the array]?

您引用的错误消息解释了原因:

error: array bound is not an integer constant before ']' token

数组的大小必须是编译时常量。 RangeOfArray-1 不是编译时间常量。因此它不能用作数组的大小。

如果要创建大小在运行时确定的数组,则必须使用动态存储。最简单的解决方案是使用标准库中的 std::vector


另一个问题是您尝试在变量赋值之前使用它(尽管它已经 zero-initialised)。这种方法不适用于 C++ 等命令式编程语言。您必须先分配一个值才能访问它。

数组需要一个在编译时可以知道的大小。 RangeOfArray 在编译时未知。此外,您正在声明数组,然后尝试为其分配一个大小,这是不可能的。为此,您需要动态数组:

#include <iostream>

int RangeOfArray;
int* arr;

int main() {

    std::cout << "Type the length number of the array  :  ";
    std::cin >> RangeOfArray;

    arr = new int[RangeOfArray];
}

..或者最好是 std::vector:

#include <iostream>
#include <vector>

int main() {

    std::cout << "Type the length number of the array  :  ";
    int vec_size; std::cin >> vec_size;

    std::vector<int> vec;
    vec.resize(vec_size);
}

2 个选项中的任何一个都有效。

错误 1

在标准 C++ 中,数组的大小必须是编译时间常数。所以当你写道:

int RangeOfArray; 
int arr[RangeOfArray-1]; //not standard c++

语句 int arr[RangeOfArray-1]; 不是标准 C++,因为 RangeOfArray - 1 不是 常量表达式

错误 2

来自 Array declarators documentation:

If the expression is a constant expression, it shall have a value greater than zero.

这意味着即使 RangeOfArray 是常量表达式,由于 static initializationRangeOfArray 将用 0 初始化,因此表达式 RangeOfArray - 1计算结果为负整数 -1。根据上面引用的声明,int[-1]; 无效。

解决方案

更好的方法是使用 std::vector,如下所示:

#include <iostream>
#include<vector>
//global variables
 
std::vector<int> arr; // empty vector


void functionOne(){
    std::cout<<"functionOne called with: "<<arr.size()<<std::endl;
} 

void functionTwo(){
    std::cout<<"functionTwo called with: "<<arr.size()<<std::endl;
} 


int main (){
 int RangeOfArray = 0;
 std::cout<<"Type the length number of the array  :  ";
 std::cin >> RangeOfArray;
 
 //resize the vector named arr 
 arr.resize(RangeOfArray);
 
 //call functionOne 
 functionOne();
 
 //call functionTwo
 functionTwo();

}