Этот код является частью моей реализации проблемы аренды каноэ в динамическом программировании.
Я динамически размещаю двумерный массив в куче и сохраняю возвращенный адрес в переменную указателя типа намассив.Сама двумерная матрица представляет собой идеальный квадрат N * N.Я использую этот неортодоксальный подход, потому что массив хранится в главном порядке строк для простоты хранения его в кеше.
Затем я хочу передать этот указатель на массив в функцию, чтобы заполнить таблицу,И я использую нестандартный параметр шаблона, потому что я могу передавать указатель на массив другого размера.Я заранее не знаю размер матрицы, который определяется вводом пользователя.
Вот мой код.Я использую int8_t
, потому что я знаю, что каждое из значений в матрице будет числом <256. </p>
#include <cstdint> // for uint8_t
#include <cstdlib> // for size_t, EXIT_SUCCESS
#include <iostream>
#include <vector>
using std::cin;
using std::vector;
template <size_t num_of_stations>
void fillPrices(uint8_t (*&prices)[num_of_stations])
{
}
int main()
{
size_t num_of_stations = 0;
cin >> num_of_stations;
uint8_t (*prices)[num_of_stations] = static_cast<uint8_t(*)[num_of_stations]>( malloc(sizeof(uint8_t[num_of_stations][num_of_stations])) );
fillPrices(prices);
delete[] prices;
prices = nullptr;
return EXIT_SUCCESS;
}
Я получаю ошибку компиляции.Что нужно изменить в коде, чтобы он компилировался?
canoe_rental.cpp: In function ‘int main()’:
canoe_rental.cpp:32:22: error: no matching function for call to ‘fillPrices(uint8_t (*&)[num_of_stations])’
fillPrices(prices);
^
canoe_rental.cpp:11:6: note: candidate: template<long unsigned int num_of_stations> void fillPrices(uint8_t (*&)[num_of_stations])
void fillPrices(uint8_t (*&prices)[num_of_stations])
^
canoe_rental.cpp:11:6: note: template argument deduction/substitution failed:
canoe_rental.cpp:32:22: note: variable-sized array type ‘long int’ is not a valid template argument
fillPrices(prices);
^