Ошибка с преобразованием

500
20 июня 2018, 22:30

При вызове этой функции компилятор выдает ошибку

(не существует подходящего конструктора для преобразования из point(*)[20] в point).

int amount_of_alive_neighbours(point playground[_HEIGHT_][_WIDTH_], int x, int y)
{
    int count = 0;
    int neighbours[8][2];
    int _x, _y;
    neighbours_coordinates(neighbours, x, y);
    for (int i = 0; i < 8; i++)
    {
        _x = neighbours[i][0];
        _y = neighbours[i][1];
        if (_x < 0 || _y < 0)
            continue;
        if (_x >= _WIDTH_ || _y >= _HEIGHT_)
            continue;
        if (playground[_x][_y].alive)
            count++;
    }
    return count;
}

Вызываю так:

alive_neighbours = amount_of_alive_neighbours(previous_playground, i, j);

point - структура

struct point
{
bool alive:true;
}

Откуда вызываю функцию:

void next_playground(point new_playground[_WIDTH_][_HEIGHT_], point previous_playground[_WIDTH_][_HEIGHT_])
{
    int alive_neighbours;
    point pg;
    for (int i = 0; i < _WIDTH_; i++)
        for (int j = 0; j < _HEIGHT_; j++)
        {
            pg = previous_playground[i][j];
            alive_neighbours = amount_of_alive_neighbours(previous_playground, i, j);
        }
}

Ниже краткий пример законченного кода

    #include "stdafx.h"
#define _HEIGHT_ 20
#define _WIDTH_ 20
struct point
{
    bool alive : true;
};
int amount_of_alive_neighbours(point playground[_HEIGHT_][_WIDTH_], int x, int y)
{
    return 1;
}
void next_playground(point new_playground[_WIDTH_][_HEIGHT_], point previous_playground[_WIDTH_][_HEIGHT_])
{
    int alive_neighbours;
    point pg;
    for (int i = 0; i < _WIDTH_; i++)
        for (int j = 0; j < _HEIGHT_; j++)
        {
            pg = previous_playground[i][j];
            alive_neighbours = amount_of_alive_neighbours(previous_playground, i, j); //ERROR
        }
    }
int main()
{
    point pg1[_WIDTH_][_HEIGHT_];
    point pg2[_WIDTH_][_HEIGHT_];
    next_playground(pg1, pg2);
}
Answer 1

Массивы с фиксированным размером в c++ передаются только по ссылке:

int foo(int (& array)[2][4]){
   return sizeof(array);
}
int bar(){
    int array[2][4];
    return foo(array);
}

Или можно преобразовать в двойной указатель и передавать размер отдельно.

Лучше использовать std::array для таких массивов.

READ ALSO
Правильная выгрузка DLL

Правильная выгрузка DLL

Делаю следующие события:

155
No match &#39;operator = &#39; in std::vector

No match 'operator = ' in std::vector

Всем доброго вечера!

194
Не присваивается значение char

Не присваивается значение char

Не присваивается значение элементам структуры типа char

211