2016-11-18 3 views
-2

У меня есть две функции, и мне нужно передать массив table и изменить его содержимое.Как передать многомерный массив в качестве указателя?

void play_game(int mines, int c, int r) { 
    char (*table)[c][r]; 
    build_field(*table, c, r); 
} 

void build_field(char *table ,int tamanhox, int tamanhoy) { 
    int i, x; 
    for(i=1;i<tamanhoy+1;i++){   
     table[tamanhoy][tamanhox] = '-';   
     for(x=0;x<tamanhox-1;x++){ 
      table[tamanhoy][tamanhox] = '-'; 
    } 
} 

В этом коде есть ошибки в table[tamanhoy][tamanhox].

+1

Если вы готовы взять на себя определенную схему памяти под вы можете передать таблицу как ' символ ** '. В противном случае вам нужно создать собственное представление матрицы на плоском пространстве памяти 'char *' и использовать это. Существует множество хороших библиотек C-матрицы. – David

+0

@David: 'char **' не является многомерным массивом, не может представлять один или указывать на один! Это совершенно другая структура данных. Тип OP может быть легко передан функции. И решение очевидно. – Olaf

+0

@Olaf: Да, это разные структуры данных. Но если вы предполагаете определенный макет памяти, вы абсолютно можете использовать char ** для индексации в многомерный массив. Это, по-видимому, плохая форма, но иногда вы не можете обойти ее. Я вижу, вы жаловались на эту технику в ссылке, которую я собираюсь опубликовать, так что, думаю, мы просто не согласны. http://stackoverflow.com/questions/2565039/how-are-multi-dimensional-arrays-formatted-in-memory – David

ответ

1

Вы получаете сообщение об ошибке, поскольку вы указываете аргумент table как указатель на char, а не указатель на массив массивов. You тоже не делаем table фактически пункт везде.

Обе эти проблемы могут быть решены путем не делает table указатель на массив массива, а также путем изменения порядка вы передаете аргументы в build_field функции:

char table[c][r]; 
build_field(c, r, table); 

... 

void build_field(int tamanhox, int tamanhoy, char table[][tamanhoy]) 
{ 
    // Use table like a normal array of array (i.e. table[x][y] = z) 
} 

Есть еще несколько проблем с кодом, который вы показываете, например, вы всегда используете table[tamanhoy][tamanhox] в функции build_field, когда вы, вероятно, имеете в виду table[x][i].

Вы также выходите из пределов функции, помните, что индексы основаны на нуле, поэтому действительные индексы для первого «измерения» равны 0 по tamanhox - 1 (включительно).

+1

В качестве побочного элемента: использование обоих измерений, таких как 'char table [tamanhox] [tamanhoy]', дает то же самое, но лучше от представления документализма. Он дает понять, что два целых числа являются размерами без дополнительного комментария. Также правильным типом для размеров массива является 'size_t', а не' int'. Это также ясно, что вы никогда не будете передавать отрицательную ценность. Для некоторых систем, например. большинство 64-битных архитектур, 'int' не могут представлять все индексы, поскольку они позволяют больше, чем 32 бита могут удерживать. В таких системах 'size_t' обычно составляет 64 бита. Аналогичен для некоторых 16-разрядных архитектур с более чем 16-разрядным адресным пространством. – Olaf

1

Эта декларация

char (*table)[c][r]; 

не объявляете массив. Он объявляет указатель на объект типа char[c][r]. Кстати, почему нет? :)

char[r][c] 
    ^^^^^ 

Таким образом, перед использованием этого указателя он должен быть правильно инициализирован.

В этом объявлении функции

void build_field(char *table ,int tamanhox, int tamanhoy); 

первый параметр имеет тип char *. Типы char (*)[c][r] и тип char * - это разные несовместимые типы.

Вы можете написать объявление функции, например, следующий вид

void build_field(int tamanhox, int tamanhoy, char (*table)[tamanhox][tamanhoy]); 

Но внутри этой функции вы должны разыменования указателя. Например,

(*tablw)[I][j] 

Точное объявление параметра зависит от того, как инициализируется указатель и что вы собираетесь делать. Может быть, вы имеете в виду следующие объявления

char (*table)[r]; 

и

void build_field(int tamanhox, int tamanhoy, char (*table)[tamanhoy]); 

Компилятор выдает ошибку, так как параметр функции table имеет тип символ *. Таким образом, table[I] является скалярным объектом типа char.Hense вы можете не применять к нему индексного оператора, например, table[I][x]. И кроме того, это выражение

table[tamanhoy][tamanhox] 
     ^^^^^^^^ ^^^^^^^^^ 

ни в коем случае не имеет смысла, потому что, по крайней мере, вы должны написать

table[i][x] 
    ^^^^^^ 
Смежные вопросы