运行 时读入 const int 的值 - C++
Read in value of const int when ran - C++
我有一个程序将 const int
定义为数组大小的值。无论如何我可以在程序第一个 运行 时更改此 var 的值吗?我只需要在开始时设置一次,但在尝试使用 cin
设置它时我无法编译程序,因为我收到一条错误消息:
error: array bound is not an integer constant before ‘]’ token
我的理解是没有为数组大小设置值,因此无法编译。我也尝试初始化我想设置为 1
的 var,然后在程序运行 运行 后更改它,但我也没有运气,得到同样的错误。
编辑:
前两行是我要更改的新 var
和新 const int
,下面是错误似乎源自的行。
int objectIndexSize;
const int numOfObjects = objectIndexSize;
Mat imageArray[numOfObjects];
Mat descriptorsArray[numOfObjects];
vector<KeyPoint> keypointArray[numOfObjects];
String objectName[numOfObjects];
String fileNamePostCut[numOfObjects];
您不能在堆栈上动态分配数组。您应该改用 std::vector
.
变量如
int arr[10];
嵌入在 .data
部分下的可执行文件中。你有 40 个字节的零。当您将可执行映像(.code
、.data
和其他)加载到 RAM 中时,这 40 个字节将在那里。不需要分配任何东西,因为它已经由 OS.
完成
(不确定大内存块是否会出现这种情况,因为内存可能会碎片化,而可执行映像不应该。也许编译器在幕后做了一些魔术。)
反正这就是你做不到的原因
int n = 10;
int arr[n];
但你可以做到
const int n = 10;
int arr[n];
是因为在第一种情况下编译器不知道 n
是常量(由于优化它可能会弄明白,但你明白了),而在第二种情况下它永远不会改变,这意味着编译器知道要在可执行文件中为您预分配多少内存。
现在,你显然不能做到 const int a; std::cin >> a;
因为那根本不是常数。
您可以使用以下任一方法:
int n;
std::cin >> n;
std::unique_ptr<int[]> arr(new int[n]); //C++11
//or
int *arr = new int[n]; //before C++11
或者使用 vector 并告诉它像这样保留你需要的内存:
int n;
std::cin >> n;
std::vector<int> arr;
arr.reserve(n);
如果您知道大小不会改变,您可能希望使用指针而不是向量。
我有一个程序将 const int
定义为数组大小的值。无论如何我可以在程序第一个 运行 时更改此 var 的值吗?我只需要在开始时设置一次,但在尝试使用 cin
设置它时我无法编译程序,因为我收到一条错误消息:
error: array bound is not an integer constant before ‘]’ token
我的理解是没有为数组大小设置值,因此无法编译。我也尝试初始化我想设置为 1
的 var,然后在程序运行 运行 后更改它,但我也没有运气,得到同样的错误。
编辑:
前两行是我要更改的新 var
和新 const int
,下面是错误似乎源自的行。
int objectIndexSize;
const int numOfObjects = objectIndexSize;
Mat imageArray[numOfObjects];
Mat descriptorsArray[numOfObjects];
vector<KeyPoint> keypointArray[numOfObjects];
String objectName[numOfObjects];
String fileNamePostCut[numOfObjects];
您不能在堆栈上动态分配数组。您应该改用 std::vector
.
变量如
int arr[10];
嵌入在 .data
部分下的可执行文件中。你有 40 个字节的零。当您将可执行映像(.code
、.data
和其他)加载到 RAM 中时,这 40 个字节将在那里。不需要分配任何东西,因为它已经由 OS.
(不确定大内存块是否会出现这种情况,因为内存可能会碎片化,而可执行映像不应该。也许编译器在幕后做了一些魔术。)
反正这就是你做不到的原因
int n = 10;
int arr[n];
但你可以做到
const int n = 10;
int arr[n];
是因为在第一种情况下编译器不知道 n
是常量(由于优化它可能会弄明白,但你明白了),而在第二种情况下它永远不会改变,这意味着编译器知道要在可执行文件中为您预分配多少内存。
现在,你显然不能做到 const int a; std::cin >> a;
因为那根本不是常数。
您可以使用以下任一方法:
int n;
std::cin >> n;
std::unique_ptr<int[]> arr(new int[n]); //C++11
//or
int *arr = new int[n]; //before C++11
或者使用 vector 并告诉它像这样保留你需要的内存:
int n;
std::cin >> n;
std::vector<int> arr;
arr.reserve(n);
如果您知道大小不会改变,您可能希望使用指针而不是向量。