목표 c에서 함수 매개 변수로 변수 길이의 int 배열 전달
-
05-07-2019 - |
문제
잘 작동하는 다음 코드가 있습니다 ...
int testarr[3][3] = {
{1,1,1},
{1,0,1},
{1,1,1}
};
[self testCall: testarr];
이 기능을 호출합니다.
- (void)testCall: (int[3][3]) arr {
NSLog(@"cell value is %u",arr[1][1]);
}
배열은 가변 길이가 필요합니다. 함수를 선언하는 가장 좋은 방법은 무엇입니까?
공백 사용은 작동하지 않습니다.
- (void)testCall: (int[][]) arr {
당신의 도움을 주셔서 감사합니다.
해결책
나는 이것을 다음과 같이 쓸 것이다.
- (void) testCall: (int *) aMatrice;
그렇게하면 여러 mallocs와 수학을 피할 수 있습니다. x를 기반으로 선형 배열에서 단일 오프셋을 계산할 수 있습니다. 2D 어레이의 y 좌표는 사소합니다. 또한 int **에 의해 암시 된 여러 malloc과 언어에 의해 영속 된 2D 배열 구문의 한계를 피합니다.
따라서 4x5 배열을 원한다면 다음을 수행 할 수 있습니다.
#define WIDTH 4
#define HEIGHT 5
#define INDEXOF(x,y) ((y*WIDTH) + x)
int *myArray = malloc(sizeof(int) * 5 * ELEMS_PER_ROW);
그런 다음 배열을 선형으로 또는 루프를 위해 중첩으로 초기화 할 수 있습니다.
for(int x=0; x<width; x++)
for(int y=0; y<height; y++)
myArray[INDEXOF(x,y)] = ... some value ...;
그리고 당신은 그것을 다음과 같은 방법으로 전달할 것입니다.
[foo testCall: myArray];
너비와 높이를 따라 운반하거나 더 나은 아직도 NSObject의 intmatrix 서브 클래스를 만들고 싶을 수도 있지만 모든 포인터 산술 및 스토리지를 멋진 깨끗한 API 너머로 감싸십시오.
(모든 코드는 SO에 입력했습니다)
다른 팁
C 배열은 하나 이상의 차원에서 가변적 일 수 없습니다.
당신은 이것을 가질 수 없습니다 :
int testarr[][] = {
{1,1,1},
{1,0,1,2},
{1,1}
};
그러나 당신은 이것을 가질 수 있습니다 :
int testarr[][3] = {
{1,1,1},
{1,0,1},
{1,1,1},
{4,5,6},
{7,8,9}
}
foo(testarr);
void foo(int param[][3])
{
printf("%d", param[3][1]); // prints 5
}
당신은 사용할 수 없습니다 int[][]
두 번째 치수의 크기는 배열이 메모리에 배치되는 방식에 영향을 미치기 때문입니다. 두 번째 차원을 알고 있다면 사용할 수 있습니다 int[][x]
, 그렇지 않으면 사용해야합니다 int**
배열처럼 액세스 할 수 있습니다.
그냥 사용하지 않는 이유는 무엇입니까? NSArray
또는 NSMutableArray
~와 함께 NSInteger
에스? 이러한 배열 클래스는 가변 길이이며 사용하기가 훨씬 쉽습니다.
결과가 발생합니다
- (void)testCall: (NSArray *) arr {
NSLog(@"cell value is %u", [[arr objectAtIndex:1] objectAtIndex:1]);
}
(물론, 당신은 또한 nsarray를 사용하여 testarr를 정의해야 할 것입니다.)
만약 너라면 진짜 C 배열을 사용하여 메소드 인수를 int에 대한 포인터로 만듭니다.
- (void)testCall: (int*) arr {
아마도 코드의 나머지 부분이 동일하게 유지 될 것입니다.
전화
int testarr[3][3] = {
{1,1,1},
{1,0,1},
{1,1,1}
};
[self testCall: (int *)testarr];
기능
- (void)testCall: (int *) arr
{
int (*V_arr)[3] = (int(*)[3])arr;
NSLog(@"cell value is %u",V_arr[1][1]);
}