У меня возникли проблемы с введением элемента типа std :: pair, mpfr_t> в карту. Функция станд :: make_pair вызывает ошибкуВставить mpfr_t объект как значение на карте
несовместимые типы в присвоении «__mpfr_struct *» до '__mpfr_struct [1]
Поскольку я только передавая указатель на объект mpfr_t функции rec_func я думал что я мог бы разыменовать его с помощью оператора * и сохранить полученное значение mpfr_t как на карте.
Справочная информация и структура кода: rec_func является рекурсивной функцией. Предполагается, что некоторые экземпляры будут считать. Поскольку число экземпляров чрезвычайно велико (10^50 или более), я использую тип данных mpfr_t. Чтобы избежать рекурсивной функции, вызываемой с одними и теми же аргументами более одного раза, я хотел бы использовать динамическое программирование (например, Memoization). Для этого я использую карту с вектором с тремя целыми числами в качестве ключа и mpfr_t в качестве значения.
Основная функция инициализирует карту и объект типа mpfr_t. Затем он вызывает rec_func и руки на карте и указатель на объект mpfr_t. Поскольку mpfr_t на самом деле является типом массива, он не может быть возвращен, и поэтому я просто передаю указатель на него.
Сначала необходимо установить библиотеки gmp и mfpr. Sudo APT-получить установку libgmp3-DEV Sudo APT-получить установку libmpfr-DEV libmpfr-док libmpfr4 libmpfr4-DBG
совет будет очень ценится.
#include <map>
#include <vector>
#include <iostream>
#include <gmp.h>
#include <mpfr.h>
using namespace std;
void rec_func(std::map <std::vector<int>, mpfr_t>& my_map, mpfr_t* big_int)
{
int arr[3] = {1, 2, 3};
std::vector<int> itm(arr, arr+3);
std::pair <std::vector<int>, mpfr_t> intr;
intr = std::make_pair(itm, *big_int);
//my_map.insert(intr);
//my_map.insert (std::make_pair(itm, *big_int));
}
int main()
{
mpfr_t big_int; // initialize
mpfr_init2(big_int, 200);
mpfr_set_d(big_int, 1, MPFR_RNDN); // assign value
std::map <std::vector<int>, mpfr_t> my_map;
rec_func(my_map, &big_int);
mpfr_clear(big_int); // clear the big int
my_map.clear(); // delete the map
}
Если вы все еще используете C++, возможно, используйте 'mpfr_class' вместо' mpfr_t'? Получите преимущества RAII, чтобы вы не задерживали ручную управление памятью, явно занимаясь указателями и т. Д. 'Mpfr_t' слегка магия, чтобы иметь дело с ограничениями C, но те же самые магии (' typedef'-ing size one массив структуры как 'mpft_t') конфликтуют с схемами шаблонов C++, где' mpfr_class' не будет иметь таких проблем. – ShadowRanger
Спасибо, это решило мою проблему. – fabianschroeder