programing

int 배열 초기화

stoneblock 2023. 9. 16. 08:31

int 배열 초기화

누가 배열을 초기화할 수 있는 방법이 있습니까?ints(어떤 멀티바이트 유형이든 정말 괜찮습니다), 단순히 0이 아닌 값과 1이 아닌 값으로?즉, 각 요소를 개별적으로 수행할 필요 없이 하나의 라이너에서 이 작업을 수행할 수 있는 방법이 있습니까?

int arr[30] = {1, 1, 1, 1, ...}; // that works, but takes too long to type

int arr[30] = {1}; // nope, that gives 1, 0, 0, 0, ...

int arr[30];
memset(arr, 1, sizeof(arr)); // That doesn't work correctly for arrays with multi-byte
                             //   types such as int

참고로, 사용하기memset()정적 어레이에서 이와 같은 방식으로 다음을 제공합니다.

arr[0] = 0x01010101
arr[1] = 0x01010101
arr[2] = 0x01010101

다른 옵션:

for(count = 0; count < 30; count++)
   arr[count] = 1;    // Yup, that does it, but it's two lines.

다른 생각 있으신 분?C 코드라면 해결책에 제한이 없습니다.(다른 입술도 괜찮습니다)

이것은 GCC 확장입니다.

int a[100] = {[0 ... 99] = 1};
for (count = 0; count < 30; count++) arr[count] = 1;

한 줄.:)

2줄이라고 하셨는데 쉼표로 한 줄로 할 수 있습니다.,교환입니다.

for(count = 0; count < 30 ; arr[count] = 1,count++);

런타임이 아닌 초기화 중에 이 작업을 수행할 수 있는 유일한 합리적인 방법은 다음과 같습니다.

#define ONE1     1
#define FIVE1    ONE1, ONE1, ONE1, ONE1, ONE1
#define TEN1     FIVE1, FIVE1
#define TWENTY1  TEN1, TEN1
#define FIFTY1   TWENTY1, TWENTY1, TEN1
#define HUNDRED1 FIFTY1, FIFTY1

int array [100][4] =
{
  HUNDRED1,
  HUNDRED1,
  HUNDRED1,
  HUNDRED1
};

그다음에.#define ONE2 2등등.당신이 이해합니다.

편집 : 매크로를 이렇게 많이 작성한 이유는 이 솔루션이 얼마나 유연한지 보여주기 위해서였습니다.이 특별한 경우에는 그 모든 것이 필요하지 않습니다.그러나 이와 같은 매크로를 사용하면 모든 종류의 이니셜라이저 목록을 빠르고 유연하게 작성할 수 있습니다.

{
  FIFTY1, FIFTY2,  // 1,1,1,1... 50 times, then 2,2,2,2... 50 times
  TWENTY3, EIGHTY4 // 3,3,3,3... 20 times, then 4,4,4,4... 80 times
  ... // and so on
};

C에서는 일반적으로 다음과 같은 매크로를 사용하여 자체 "지원 라이브러리"를 개발합니다.

#define SET_ALL(a_, n_, v_)\
  do { size_t i, n = (n_); for (i = 0; i < n; ++i) (a_)[i] = (v_); } while(0)

#define SET_ALL_A(a_, v_) SET_ALL(a_, sizeof(a_) / sizeof *(a_), v_)
#define ZERO_ALL(a_, n_) SET_ALL(a_, n_, 0)
#define ZERO_ALL_A(a_) SET_ALL_A(a_, 0)

코드에 사용하는 방법은

int arr[30];

SET_ALL_A(arr, 1);

한 줄에 포인터!

for (int *p = a; p < (a + 30); p++) *p = 1;

또는 반복적인 계산으로 인한 성능 저하가 섣불리 우려되는 경우(a + 30):

for (int *p = a + 30 - 1; p >= a; p--) *p = 1;

정적 값에 대한 초기화를 위해 일반적으로 다음과 같이 입력하는 것을 선호합니다.

int arr[30] = {1, 1, 1, 1, ...}; 

이 경우 컴파일러는 프리앰블 코드에서 최적화된 초기화를 뱉을 수 있습니다.

이 예에서와 같이 초기화가 더 동적인 경우도 있습니다.

int arr[30];
int x = fetchSomeValue();
for(int i=0; i<30; i++) arr[i] = x;

이 경우 코드를 작성해야 하며 일반적인 규칙은 타이핑을 최소화하는 것이 아니라 가독성을 극대화하는 것입니다.이 코드는 한 번 작성되고 여러 번 읽힙니다.

언급URL : https://stackoverflow.com/questions/13477281/initializing-an-array-of-ints