Передача элемента массива структур в функцию

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] - это два разных типа. Вы не можете смешивать. Чтобы получить доступ к членам массива, вам нужно использовать оператор [] .
  • 5
    Выберите язык и придерживайтесь его. C и C ++ - два языка, считайте их.
Показать ещё 4 комментария
Теги:
struct
function

4 ответа

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 { 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(gs).

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 , таким образом, изменения не были потеряны, но область видимости может быть проблемой.
0

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

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

void create(int a); 

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

void create(int a[9][9]); <-- No need
{ 
    a[0][2] = 4; 
}'
'
  • 0
    но я думаю, что он на самом деле хочет послать 9x9 из esses, а не только одно число, хорошо заметное на ; Тхо.
  • 0
    В его определении struct также есть пропущенная точка с запятой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню