2016-09-15 3 views
-1

16 개의 요소를 가진 double 배열 double myArray[16]이 있다고 가정합니다. 네 요소의 각 하위 집합에 대해 함수를 수행하려고합니다. 즉, 첫 번째 하위 집합은 myArray[0], myArray[1], myArray[2], myArray[3]이고 두 번째 하위 집합은 myArray[4], myArray[5], myArray[6], myArray[7]입니다.배열 길이 C의 서브 세트

하위 집합에서만 작동하는 void 함수에 대한 포인터를 사용하여 부분 집합 배열을 전달하고 해당 함수에 전달 된 주소에 값을 씁니다. myArray[8]으로 시작하는 모든 요소를 ​​사용하려면 &myArray[8]을 함수에 전달할 수 있지만 미리 지정된 길이 (이 예제에서는 4 개) 만 전달해야합니다.

도움을 주시면 감사하겠습니다.

+4

함수는 길이를 알아야합니다. 하드 코딩되었거나 매개 변수로 전달되었습니다. –

+0

함수는 배열의 크기를 어떻게 알 수 있습니까? 이 정보를 인수로 받아 들여야하기 때문에 시작 요소 (예 :'& myArray [8]')와 4의 크기를 전달하면됩니다 –

+1

'void func (double * arr, int subcount)'를 호출하고 (예를 들어)'func (& myArray [8], 4)'로 호출하십시오. 또는'#define SUBCOUNT 4'로 카운트를 고정 시키십시오. for 루프는 'for (int i = 0; i <16; i + = SUBCOUNT) func (& myArray [i], SUBCOUNT);' –

답변

0

전달 된 배열의 길이를 함수가 알 수 있도록하려면 배열은이 정보를 별도의 메모리에 저장해야합니다. 이것은 오버 헤드이며 C는 제로 오버 헤드 용으로 설계되었으므로 지원하지 않습니다.

이 정보를 자동으로 제공하는 언어가 있기 때문에 결과적으로 속도가 느려집니다.

유일한 옵션은 함수에서 작업하고자하는 배열의 크기를 하드 코딩하거나 (컨텍스트에 따라 알맞은 침대 아이디어 일 수도 있음) 또는 추가 매개 변수로 전달하는 것입니다.

0

array[16]을 마치 array[4][4]처럼 사용 하시겠습니까?

당신은 union가 사용할 수 있습니다

#include <stdio.h> 

union set { 
    double arr[16]; 
    double sub[4][4]; 
}; 

static void func(void *data) /* Why not double *? */ 
{ 
    double *x = data; 
    int i; 

    for (i = 0; i < 4; i++) { 
     printf("%f\n", *x++); 
    } 
} 

int main(void) 
{ 
    union set x = {.arr = {0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12., 13., 14., 15.}}; 
    int i; 

    for (i = 0; i < 4; i++) { 
     func(&x.sub[i]); 
    } 
    return 0; 
} 
0

에만 소정의 길이를 C에서

을 통과해야, 배열은 연속이다. 요소 0, 1, 2, 3에서 작동하려면 함수는 요소 0의 주소 만 받아야합니다. 요소 8,9,10,11에서 작동하려면 함수는 요소 8의 주소 만 수신하면됩니다. 배열의 길이를 전달하지만 배열의 하위 집합의 기본 주소는 전달합니다.

#define N 16 
#define DELTA 4 

void fun(int base, double *a) { 
    for (int i=0; i<N; i++) { 
    printf("%2d %e\n", base + i, a[i]); 
    } 
} 

double myArray[N]; 
assert(N%DELTA == 0); 
for (int i=0 i<N; i += DELTA) { 
    fun(i, &myArray[i]); 
} 
0

당신이 기능 void myFunction(double arr[4])이 경우에도 정확히 같은이 C 컴파일러 취급`무효 myFunctoin (더블 *의 편곡). 배열 자체는 값에 의해 전달되지 않습니다. 포인터 값만 전달되고 배열 요소는 포인터 산술 및 역 참조를 사용하여 참조됩니다.

C에서는 포인터와 배열간에 거의 차이가 없습니다. 배열에 할당 할 수는 없지만 포인터에 할당 할 수는 있습니다. 그 외에도 그들은 거의 상호 교환이 가능합니다.

int array[10]; 
int *ptr = &array[0]; 

// All 4 of these do the same thing 
array[3] = 5; 
*(array + 3) = 5; 
ptr[3] = 5; 
*(ptr + 3) = 5; 

// all 4 of these do the same thing too 
functionCall(&array[3]); 
functionCall(array + 3); 
functionCall(&ptr[3]); 
functionCall(ptr + 3); 

// this is pretty much the only thing different 
printf("sizeof(array)=%d\n", sizeof(array)); // prints sizeof(int)*10 
printf("sizeof(ptr)=%d\n", sizeof(ptr)); // prints sizeof(int *) 

// and this 
ptr = array + 5; // fine 
array = array + 5; // will not compile, since you can't assign to arrays. 
0

C에서는 컴파일 할 때 배열의 크기를 설정해야합니다. 배열의 길이를 동적으로 변경하면 정말 좋지 않습니다. 프로그램을 컴파일 할 때 예외가 발생해야합니다. 이 경우 메모리의 연속 된 공간을 가리키는 포인터를 사용하고 배열에서 아무 것도 추가하거나 제거 할 때마다 항상 연속적이며 쉽게 검색 할 수 있도록 realloc을 사용합니다.

그러나 배열을 사용하므로 컴파일 타임에 정의 된 크기로 되돌아갑니다. 컴파일 시간에 크기를 알기 때문에 배열을 4 개 이상으로 분할 할 수 있어야합니다.원하는만큼 많은 하위 집합을 16 개로 나누고 1을 빼면 (결과가 작동해야 함) 0-3을 0으로, 4-7을 1로, 8-11을 2로 설정하여 하위 집합을 지정할 수 있습니다. 12-16의 경우 3입니다. 코드에서 이런 식으로 보일 것입니다.

void funciton(int array[16], int subset) { 
    int i = 0; 
    for(i = 0;i < 4;i++) { 
     array[(subset * 4) + i] = foobar; 
    } 
}