如何声明可变大小的数组(全局)


18

我想制作三个相同长度的数组。根据文档,必须将int myArray[10];Array 定义为可以用10代替已知长度(另一个整数)或用array填充的数组{2, 3, 5, 6, 7}

但是,当我尝试声明一个值int arrSize = 10;,然后再声明一个基于该大小的数组时int myArray[arrSize];,得到以下内容:error: array bound is not an integer constant

有没有一种方法可以可变地确定数组大小,还是只需要对它们进行硬编码?(我被告知硬编码是不好的,要不惜一切代价避免。)


我有一个类似的问题,并做到了。我也在学习,所以不能说这是否是有效的解决方案,但它有效。参见下面的使用向量的代码部分,我花了很多时间开始理解它们,但我仍然不是专家:#include <string> #include <vector> #include <iostream> #include <algorithm> #include <string.h>使用命名空间std; int main(){字符串名称;字符串地址;弦镇 弦国家 字符串答案;vector <vector <string >> personData; for(;;){vector <string> myTempData; cout <<“输入名称或n退出” << endl; getline(cin,名称); if(name ==“ n”){bre
Misterxp

Answers:


22

您的问题实际上分为两部分。

1 /如何在数组外部声明数组的恒定大小?

您可以使用宏

#define ARRAY_SIZE 10
...
int myArray[ARRAY_SIZE];

或使用一个常数

const int ARRAY_SIZE = 10;
...
int myArray[ARRAY_SIZE];

如果您初始化了数组并且需要知道其大小,则可以执行以下操作:

int myArray[] = {1, 2, 3, 4, 5};
const int ARRAY_SIZE = sizeof(myArray) / sizeof(int);

第二个sizeof是关于数组的每个元素的类型,在此处int

2 /如何获得一个动态大小的数组(即直到运行时才知道)?

为此,您将需要在Arduino上工作的动态分配,但是通常不建议这样做,因为这会导致“堆”变得零散。

您可以执行(C方式):

// Declaration
int* myArray = 0;
int myArraySize = 0;

// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source)
if (myArray != 0) {
    myArray = (int*) realloc(myArray, size * sizeof(int));
} else {
    myArray = (int*) malloc(size * sizeof(int));
}

或(C ++方式):

// Declaration
int* myArray = 0;
int myArraySize = 0;

// Allocation (let's suppose size contains some value discovered at runtime,
// e.g. obtained from some external source or through other program logic)
if (myArray != 0) {
    delete [] myArray;
}
myArray = new int [size];

有关堆碎片问题的更多信息,可以参考此问题


4
1)ARRAY_SIZE = sizeof myArray / sizeof myArray[0];,这样您就可以更改myArray的类型而不会引入错误。由于相同的原因,myArray = realloc(myArray, size * sizeof *myArray);。顺便说一句,强制转换malloc()或的返回值realloc()也没有用。2)myArray != 0在C版本中检查无用,realloc(NULL, sz)等效于malloc(sz)
埃德加·波内(Edgar Bonet)2015年

const int ARRAY_SIZE = 10; int myArray [ARRAY_SIZE]; 您真的认为有可能吗?这将使可变地修改阵列误差C.
阿伦乔Cheriyan

CI中的@ArunCheriyan不知道,但是在C ++中,它可以编译并完美运行。由于Arduino基于C ++,因此这里没有问题。
jfpoilpret

0

必须在编译时知道数组的大小。否则,您应该使用以下方法动态分配内存:

char *chararray = malloc(sizeof(char)*x);

可以在应用程序代码中设置x(一个整数)(如果您希望它是一个持久的但可配置的设置,则可以从eeprom中加载它)。


但是,如果您只想声明一些相同大小的数组,则只需声明数字一个常量,如下所示:

const int arrsize = 10;
char array1[arrsize];
int array2[arrsize];

我认为,仅当您合理地希望用户希望在某个时候更改设置时,才对硬编码内容有意义。不知道是不是这样


用符号而不是按字面编码可以提供两个好处:1)精心选择的符号说明或至少暗示了选择的原因;2)当需要根据该选择调整程序或模块的其他部分时,使用相同符号的表达式可使该操作自动进行,从而使维护变得更加容易。
JRobert

[有点题外话,但是“用户”是模棱两可的,因为它可能意味着许多人中的一个。如果没有另外说明,通常表示最终用户,即最终产品的消费者。可能是下一位程序员,您的代码的下一位消费者,实际上,在我忘记了代码的实质内容之后,实际上可能是(通常,以我自己的经验)一年或更长时间。或系统设计师将您的代码作为现成的模块包含在他/她的产品中。我怀疑您是第二个“用户”。
JRobert

0

如果您知道数组的最大长度,只需将数组初始化为该长度,然后使用整数来告诉程序要使用多少数组。如果它是7,10字节之间的差异,那么您就不会浪费那么多的内存分配。


0

我知道我来晚了一点,但是从理论上讲,不能使用变量来定义规则数组的数量来创建常规数组:

int arrSize;
int myArray[arrSize];

这将显示错误,因为在声明数组时,程序期望括号之间的值是一个常数。但是,您可以通过一种方式创建一个带有变量的数组,该变量定义了通过对值集进行动态内存分配来定义该数组将要拥有的值的数量(此方法仅针对一维数组进行了测试,尚未尝试过多维),它是这样的:

//First you create a pointer for the memory space to be separated for the set you're creating
int* myArray;
int arrSize; //Then you define the variable that will determine the amount of elements the array is going to have, you can give it a value whenever you want as long as this int is defined before the values in myArray are set 
myArray=(int*)calloc(arrSize,sizeof(int)) //Here, you establish that the instance myArray (whose memory space has already been separated through the creation of the pointer) will be separated into arrSize amount of elements of type int with a maximum memory value (in bytes) equal to the maximum available for the int type variables

此后,剩下要做的就是为实例myArray(现在已经是一个Array)中创建的每个元素分配一个值,就像为创建为myArray [arrSize]的普通数组一样。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.