2010-04-05 3 views
2

다차원 배열을 전달하는 간단한 테스트 프로그램을 작성하고 있습니다. 나는 피 호출자 기능의 서명을 얻기 위해 고심하고있다.다차원 배열 전달에 도움주세요

코드는 내가 가진 :

void p(int (*s)[100], int n) { ... } 

... 

{ 
    int s1[10][100], s2[10][1000]; 
    p(s1, 100); 
} 

이 코드는 작업 표시하지만, 내가 의도하지 않습니다. 나는 값의 범위가 100 또는 1000인지 여부를 알지 못하지만 함수 서명을 사용하여 10 개의 포인터가 있음을 알아야한다. 첫 번째 시도로

:

void p(int (*s)[10], int n) // n = # elements in the range of the array 

하고, 두 번째로는 :

void p(int **s, int n) // n = # of elements in the range of the array 

그러나 아무 소용이

나는이 제대로 작동하려면 얻을 수가 있습니다. 나는 서명에서 100이나 1000을 하드 코드하고 싶지는 않지만 대신에 그것을 전달한다. 항상 10 개의 배열이 있다는 것을 명심해야한다.

는 분명히, 나는 함수를 선언하지 않으려 :

void p(int *s1, int *s2, int *s3, ..., int *s10, int n) 

참고로, 내가 a similar question에 대한 답변 찾고 있어요하지만 여전히 혼란.

답변

4

당신은이 작업을 위해 배열을 바꾸어하는 데 필요한 함수에 전달합니다. 이제

int s1[100][10]; 
int s2[1000][10]; 

를 선언,이 같은 기능에 이것들을 전달할 수 있습니다

때문에 C 형 시스템은, 배열 인수는 의미에서 "유연하게"될 수 있습니다 작동하는 방식의
void foo(int (*s)[10], int n) { 
    /* various declarations */ 
    for (i = 0; i < n; i++) 
     for (j = 0; j < 10; j++) 
      s[i][j] += 1 
} 

당신 가장 왼쪽의 색인에서 원한다.

+0

또는 void p (int s [] [10], int n)' – outis

+1

@outis : 확실히 맞습니다. 나는 원래 질문을 모방하기 때문에'int (* s) [10]'을 부분적으로 사용 했었고 또한 독자가 실제로 무엇이 사실인지에 대해 오도하고 있기 때문에'int [] [10] '와 같은 인자 선언을 개인적으로 피하는 경향이 있기 때문에 부분적으로 사용했습니다. 함수에 전달됩니다. –

+0

감사합니다. 이것은 내가 원래 원했던 것을 시행하는 올바른 방법 인 것 같습니다. 유일한 문제는 전치 된 구조가 내 코드를 방해한다는 것입니다. 다차원 배열을 동적으로 구성하고 범위를 전달하는 것이 더 적절하고 이해하기 쉽다는 다른 대답이 나타납니다. – snap

2

또한 매트릭스에 대한 struct을 만들 수 있고 p

struct Matrix{ 
    int **array; 
    int n; 
    int m; 
}; 


void p(Matrix *k){ 
    length=k->m; 
    width=k->n; 
    firstElement=k->array[0][0]; 
} 
+0

이 방법은 배열의 두 치수 모두에서 유연성을 허용한다는 점에서보다 일반적입니다. 그러나,'array'는 정수에 대한 포인터 인'n'의 단일 배열이고, 각각은'm' 정수의 배열을 가리 킵니다. 구문 상 유사점에도 불구하고, 이는 몇몇 상수 N과 M에 대한 간단한 선언'int array [N] [M]'과 매우 다릅니다. –