длина ссылочного параметра массива описывается другим параметром в прототипе

c++ function parameters

54 просмотра

1 ответ

27 Репутация автора

Хорошо, у меня странная проблема. У меня есть класс экрана с переменными screenwidthи screenheightи zbufferс длиной screen.screenwidth * screen.screenheight. Когда я хочу передать в zbufferфункцию, я делаю это так,

void func(Screen& screen,double (&zbuffer)[screen.screenwidth*screen.screenheight]);

И это работает. Однако в моем классе проигрывателя в файле .h я определяю функцию, подобную этой

void rendervisiblehunks(Screen& screen,double (&zbuffer)[screen.screenwidth*screen.screenheight]);

Без проблем. Затем в файле .cpp у меня есть это

void Player:: rendervisiblehunks(Screen& screen,double (&zbuffer)[screen.screenwidth*screen.screenheight]){
}

Параметры функции копируются и вставляются, но все равно говорится, что не соответствует ни одному объявлению функции в файле .h. Я попытался изменить zbuffersдлину до 100 в обоих файлах, и это работало просто не с оригинальной screen.screenwidth*screen.screenheightдлиной. Почему это работает с другими функциями, но не с этой. И почему это работает в файле .h, а не в файле .cpp. И каковы правила использования параметров функции в качестве размеров массива для другого параметра? (оказывается, вы не можете сделать это, кстати.)

я копирую и вставляю в другую функцию, в которой он работает.

void render(Triangle& triangle,Player& camera,Screen& screen,double     (&zbuffer)[screen.screenwidth*screen.screenheight]);

я не могу поверить, что я не думал об этом раньше, но я просто положу zbufferв класс экрана

Автор: Ben Beazley Источник Размещён: 19.07.2016 12:34

Ответы (1)


1 плюс

369697 Репутация автора

Решение

Вы не можете использовать одно значение параметра, чтобы определить другое значение параметра. Вам нужно будет передать значения индивидуально:

class Screen
{
    //...
    int screenwidth;
    int screenheight;
    double *zbuffer;
    //...
};

class Player
{
public:
    //...
    void rendervisiblehunks(Screen& screen, double *zbuffer, int numInBuffer);
    //...
};

...

void Player::rendervisiblehunks(Screen& screen, double *zbuffer, int numInBuffer)
{
    // use zbuffer up to numInBuffer elements as needed...
}

Screen screen;
Player p;
...
p.rendervisiblehunks(screen, screen.zbuffer, screen.screenwidth * screen.screenheight);

Что можно упростить, удалив лишние параметры:

class Screen
{
    //...
    int screenwidth;
    int screenheight;
    std::vector<double> zbuffer;
    //...
};

class Player
{
public:
    void rendervisiblehunks(Screen& screen);
};

...

void Player::rendervisiblehunks(Screen& screen)
{
    // use screen.zbuffer up to screen.zbuffer.size() elements as needed...
}

Screen screen;
Player p;
...
p.rendervisiblehunks(screen);
Автор: Remy Lebeau Размещён: 19.07.2016 01:05
Вопросы из категории :
32x32