가변 크기의 배열을 선언하는 방법


18

길이가 같은 3 개의 배열을 만들고 싶습니다. 문서 에 따르면 배열은 int myArray[10];10을 알려진 길이 (다른 정수)로 대체하거나 배열로 채울 수있는 위치 로 정의해야합니다 {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> 네임 스페이스 std를 사용하는 #include <string.h>; int main () {문자열 이름; 문자열 주소; 끈 도시; 문자열 국가; 문자열 답변; 벡터 <벡터 <문자열 >> personData; for (;;) {vector <string> myTempData; cout << "이름을 입력하거나 종료하려면 n을 입력하십시오"<< endl; getline (cin, name); if (name == "n") {bre
Misterxp

답변:


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);. BTW, 반환 값을 캐스팅 malloc()하거나 realloc()쓸모가 없습니다. 2) 점검 myArray != 0으로서 C 버전은 쓸모가 realloc(NULL, sz)동일하다 malloc(sz).
Edgar Bonet

const int ARRAY_SIZE = 10; int myArray [ARRAY_SIZE]; 정말 가능하다고 생각하십니까?. 이것은 C에서 다양하게 수정 된 배열 오류를 줄 것이다.
Arun Joe 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

"약간 벗어난 주제이지만" "사용자"는 여러 사람 중 하나를 의미 할 수 있으므로 모호합니다. 일반적으로 달리 명시되지 않는 한 최종 사용자, 최종 제품의 소비자를 의미합니다. 다음 프로그래머, 코드의 바로 다음 소비자가 될 수 있습니다. 실제로 내 세부 사항을 잊어 버린 후 1 년 이상 ( 실제로 내 경험에 따라) 귀하가 될 수 있습니다 . 또는 코드를 제품에 바로 사용할 수있는 모듈로 포함하는 시스템 설계자. 두 번째 "사용자"를 의미한다고 생각합니다.
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 [arrSize]로 생성 된 일반 배열에서와 같이 myArray 인스턴스에서 생성 된 모든 요소 (이미 지금은 Array 임)에 값을 할당하면됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.