2010-04-05 2 views
2

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

код у меня есть:

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) 

FYI, я смотрю на ответы на a similar question, но до сих пор путают.

ответ

4

Вам необходимо перенести ваши массивы для этой работы. Объявить

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 работает, аргумент массив может быть только «гибкий» в том смысле, вы хочу в своем левом индексе.

+0

Альтернативно, void p (int s [] [10], int n) ' – outis

+1

@outis: Совершенно верно. Я использовал 'int (* s) [10]' отчасти потому, что я подражал оригинальному вопросу, а также потому, что лично я предпочитаю избегать объявлений аргументов типа 'int s [] [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. Несмотря на синтаксические сходства, это очень отличается от простого объявления 'int array [N] [M]' для некоторых констант N и M. –

Смежные вопросы