Помогите пожалуйста с прохождением многомерных массивов - PullRequest
2 голосов
/ 05 апреля 2010

Я пишу простую тестовую программу для прохождения многомерных массивов. Я изо всех сил пытался получить подпись функции вызываемого абонента.

Код, который у меня есть:

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

...

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

Этот код работает, но это не то, что я хотел. Я хочу, чтобы функция p не замечала, является ли диапазон значений 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) 

К вашему сведению, я ищу ответы на аналогичный вопрос , но все еще в замешательстве.

Ответы [ 2 ]

4 голосов
/ 05 апреля 2010

Вам нужно транспонировать свои массивы, чтобы это работало.Объявите

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

Теперь вы можете передать их функции, подобной этой:

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
}

Из-за того, как работает система типов C, аргумент массива может быть только «гибким»в том смысле, в каком вы хотите в его крайнем левом указателе.

2 голосов
/ 05 апреля 2010

Вы также можете создать 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];
}
...