这段代码是我在动态编程中实现独木舟租赁问题的一部分。
我在堆上动态分配一个二维数组,并将返回的地址保存到指向数组的指针类型的变量中。二维矩阵本身是一个完美的N * N平方。我之所以使用这种非传统的方法,是因为该数组以行优先顺序存储,以便于将其存储到缓存中。
然后,我想将指向数组的指针传递给函数以填充表。我正在使用非类型模板参数,因为我可能正在将指针传递给其他大小的数组。我不知道矩阵的大小是由用户的输入预先确定的。
这是我的代码。我使用int8_t
是因为我知道矩阵中的每个值都将是一个<256的数字。
#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);
^
答案 0 :(得分:0)
我认为非类型模板参数比它们值得的麻烦更多。因此,我通过将指向数组的指针作为void*
传递,还传递了指向数组的元素数量,然后仅使用类型转换来解决了这个问题。现在,在体内,我可以按预期使用数组。有点不优雅,但是行得通!
void fillPrices(void* ptr, size_t num_of_stations)
{
uint8_t (*prices)[num_of_stations] = static_cast<uint8_t(*)[num_of_stations]>(ptr);
}
// To call the function:
int main() {
// more code here
fillPrices(prices, num_of_stations);
}