2016-12-23 4 views
0

У меня возникли проблемы с введением элемента типа 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 

} 
+0

Если вы все еще используете C++, возможно, используйте 'mpfr_class' вместо' mpfr_t'? Получите преимущества RAII, чтобы вы не задерживали ручную управление памятью, явно занимаясь указателями и т. Д. 'Mpfr_t' слегка магия, чтобы иметь дело с ограничениями C, но те же самые магии (' typedef'-ing size one массив структуры как 'mpft_t') конфликтуют с схемами шаблонов C++, где' mpfr_class' не будет иметь таких проблем. – ShadowRanger

+0

Спасибо, это решило мою проблему. – fabianschroeder

ответ

0

Тип mpfr_t не простая структура, в самом деле, как mpfr.h заголовок, это массив размера одного:

typedef __mpfr_struct mpfr_t[1];

Это означает, что вы не можете просто скопировать его с помощью = (как это делается в std::make_pair).

Самое упрощенное решение - использовать указатель на mpfr_t и сохранить его в std::pairstd::map).

+0

Спасибо, проблема решена :) – fabianschroeder

Смежные вопросы