2013-12-24 5 views
0

Я пробовал этот код, но он не работает. Я хочу отправить только элемент p из struct grid, а не всю структуру функции.Передача элемента массива структур в функцию

struct grid{ 
    int p; 
    int s; 
} 

void create(int a[9][9]); 
{ 
    a[0][2] = 4; 
} 

int main() 
{ 
    struct grid a[9][9]; 
    create(a.s); 
} 
+2

'int',' int [] [9] '- два разных типа. Вы не можете смешивать. Чтобы получить доступ к элементам массива, вам нужно использовать '[]' operator. – Mahesh

+5

Выберите язык и придерживайтесь его. C и C++ - это два языка, считайте их. –

+4

Нет простого способа сделать то, что вы просите на C, без реструктуризации вашей программы. –

ответ

0

Вы передаете целое к функции, которая ожидает указатель на 2D array в качестве аргумента,

Прототип функции принять переменную-член s структуры grid в качестве аргумента должно быть следующим,

void create(int a); 

Также есть ненужная точка с запятой в вашей программе в определении функции.

void create(int a[9][9]); <-- No need 
{ 
    a[0][2] = 4; 
}` 
` 
+0

, но я думаю, что он действительно хочет отправить в 9x9 эсс, а не только одно число, хорошо замеченное на ';' tho. – RichardPlunkett

+0

Отсутствует точка с запятой в его определении 'struct'. –

1

Вы в основном есть три варианта, переключение двух матриц, поставить размеры в структуры, или create() принять массив структуры:

два массива:

void create(int a[9][9]) 
{ 
    a[0][2] = 4; 
} 

int main() 
{ 
    int p[9][9]; 
    int s[9][9]; 
    create(s); 
} 

- или - введите размеры в конструкцию:

struct grid{ 
    int p[9][9]; 
    int s[9][9]; 
}; 

void create(int a[9][9]) 
{ 
    a[0][2] = 4; 
} 

int main() 
{ 
    struct grid a; 
    create(a.s); 
} 

- или - Передайте массив структуры

struct grid{ 
    int p; 
    int s; 
}; 

void create(struct grid[9][9] * a) 
{ 
    (*a)[0][2].s = 4; 
} 

int main() 
{ 
    struct grid a[9][9]; 
    create(&a); 
} 

Вы не можете вишневый выбрать элементы из массива или матрицы структур

1

Как и другие указали, что вам нужно сделать нельзя по тому пути. Один из способов решения этой проблемы заключается в преобразовании матрицы перед передачей его в метод:

using namespace std; 

struct grid{ 
    int p; 
    int s; 
}; 

void create(int a[9][9]) 
{ 
    a[0][2] = 4; 
} 

void ExtractS(struct grid a[9][9], int s[9][9]) 
{ 
    for (int i = 0; i < 9; i++) 
     for (int j = 0; j < 9; j++) 
      s[i][j] = a[i][j].s; 
} 

int main() 
{ 
    struct grid a[9][9]; 
    int s[9][9]; 
    ExtractS(a, s); 
    create(s); 
} 

Но это открывает больше вопросов, чем ответы:

  • данные должны быть возвращены обратно в исходную матрицу структур, или иным образом изменения, внесенные с помощью создают теряется
  • Этот метод очень неэффективен, поскольку он копирует все данные

Может быть, вы должны пересмотреть т он проектирует и делает create функция получает матрицу grid элементов.

+0

Вы могли бы сделать преобразование, если вместо «int» преобразовать матрицу ссылок на 'int', так что изменения не будут потеряны, но проблема может быть проблемой. –

1

Начальная нота: void create(int a[9][9]) витки на самом деле в
void create(int a[][9]) или void create(int (*a)[9])

Вы можете хотеть void create(int (&a)[9][9]).

Как вы уже struct grid { int p; int s; }; и struct grid a[9][9];

Вы должны инициализировать так:

void create(grid (&g)[9][9]) 
{ 
    g[0][2].s = 4; 
} 

или изменить, как-структуру

struct grid { 
    int p[9][9]; 
    int s[9][9]; 
}; 

А затем

void create(grid &g) 
{ 
    g.s[0][2] = 4; 
} 

или

void create(int (&a)[9][9]) 
{ 
    a[0][2] = 4; 
} 

, что вы называете соответственно create(g) и create(g.s).

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