Как использовать нестандартные параметры шаблона для передачи указателя на массив? - PullRequest
0 голосов
/ 25 октября 2018

Этот код является частью моей реализации проблемы аренды каноэ в динамическом программировании.

Я динамически размещаю двумерный массив в куче и сохраняю возвращенный адрес в переменную указателя типа намассив.Сама двумерная матрица представляет собой идеальный квадрат 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);
                      ^

1 Ответ

0 голосов
/ 25 октября 2018

Я думаю, что нестандартные параметры шаблона доставляют больше хлопот, чем стоят.Поэтому я решил эту проблему, передав указатель на массив как 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...