我无法访问 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 initialization,RangeOfArray
将用 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();
}
你好,如果我的英语有错误,首先请原谅我,我是 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 initialization,RangeOfArray
将用 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();
}