문제

잘 작동하는 다음 코드가 있습니다 ...

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]);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top