我根本不知道任何C ++,但我正在尝试对我的应用程序正在使用的C ++库进行非常小的更新。在我开始对此进行攻击之前,我希望有人可以告诉我以下内容的正确语法:
我有以下几行代码:
#define A_NUMBER 100
#define ANOTHER_NUMBER 150
enum {
type1,
type2,
};
static int someMethod(int type)
{
char command[A_NUMBER];
//...more code
}
我需要做的是基于类型参数(type1或type2)我需要能够将数组的大小设置为A_NUMBER或ANOTHER_NUMBER。
在伪代码中,它将类似于:
if (type == type1) {
char command [A_NUMBER]
}
else if (type == type2) {
char command [ANOTHER_NUMBER]
}
有没有办法动态定义大小?
答案 0 :(得分:5)
是的,您可以使用std::vector<char>
:
if (type == type1) {
std::vector<char> x(A_NUMBER);
} else if (type == type2) {
std::vector<char> x(ANOTHER_NUMBER);
}
请记住将标题包含在:
中#include <vector>
虽然您的示例代码与&#34;伪代码匹配&#34;在这个问题中,我认为问题的一部分是如何通过类型决定大小,然后无条件地使用结果存储,即在条件块之外。
然后它变得如此简单:
std::vector<char> x;
if (type == type1) {
x.resize(A_NUMBER);
} else if (type == type2) {
x.resize(ANOTHER_NUMBER);
}
答案 1 :(得分:0)
是和否。在标准C ++中,您无法将数组保留在堆栈中并且在运行时确定其大小。
但是,您可以将数组转换为动态分配的数组(即在堆上)。在C ++中,执行此操作的标准方法是使用std::vector
:
std::vector<char> command(A_NUMBER); // or ANOTHER_NUMBER
索引与以前一样有效:command[5]
但是,如果你需要将数组传递给需要C风格数组的东西(即char *
),你必须使用其中一个:
command.data(); // if your compiler supports C++11
&command[0]; // if it does not
当然,要使用std::vector
,您必须#include <vector>
。
答案 2 :(得分:0)
这是一个适用于C和C ++的例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{
char *opt;
if(argc == 2) {
opt = *++argv;
}
else {
printf("Usage: %s [small|large]\n", *argv);
return EXIT_FAILURE;
}
int *arr;
int arrlen = 0;
if (strcmp(opt, "small") == 0) {
arrlen = 3;
arr = (int *) malloc(arrlen*sizeof(int));
int i;
for(i = 0; i < arrlen; i++)
arr[i] = i+1;
}
else if (strcmp(opt, "large") == 0) {
arrlen = 5;
arr = (int *) malloc(arrlen*sizeof(int));
int i;
for(i = 0; i < arrlen; i++)
arr[i] = i+1;
}
if (arrlen > 0) {
int i;
for(i = 0; arr[i]; i++)
printf("%i, ", arr[i]);
printf("\n");
free(arr);
}
return EXIT_SUCCESS;
}
示例:
[gyeh@gyeh stackoverflow]$ ./dynarr
Usage: ./dynarr [small|large]
[gyeh@gyeh stackoverflow]$ ./dynarr small
1, 2, 3,
[gyeh@gyeh stackoverflow]$ ./dynarr large
1, 2, 3, 4, 5,