Ошибка: объявлена ​​как функция, возвращающая массив в c (библиотека mpfr)

Я начинающий с mpfr, я написал эту программу, чтобы сделать конкретный расчет и получить его, как вы видите, но я не знаю, почему эта ошибка появляется, это самый важный мой код:

mpfr_t  myfct(int n)

{
   /......./
        return mpfr_get(result,MPFR_RNDN);

}

int main(void)
{

    mpfr_t U;
    mpfr_set_default_prec (53); 

    mpfr_set_emin (-1073);
    mpfr_set_emax (1024);

    n=10;
    mpfr_init2(U,24);
    mpfr_get(U,my_fct(n),MPFR_RNDN);
    mpfr_printf ("result: %.40Rg\n", U);

    mpfr_clear(U);

    return 0;
}

В чем дело??

2 ответа

Решение

Как и типы GMP, mpfr_t является массивом размера 1 (элемент является структурой, но вам не нужно это знать). Если вы решили написать функцию, которая возвращает число MPFR, у вас есть 2 возможности (среди прочих):

  1. Вызывающая сторона выделяет и вводит mpfr_t с некоторой заданной точностью. В этом случае mpfr_t должен быть указан в качестве аргумента функции, и это указатель на этот массив, который фактически передается (согласно правилам языка Си). По сути, это можно рассматривать как передачу переменной по ссылке. Функции MPFR используют этот метод.
  2. Звонящий ничего не выделяет. Прототип функции должен быть таким, чтобы функция возвращала указатель mpfr_ptr к структуре. Таким образом, эта функция будет выделять mpfr_t обычно с malloc (чтобы память не освобождалась при возврате функции), затем инициируйте структуру с помощью mpfr_init2, Точность может быть выбрана этой функцией или передана в качестве аргумента.

Примечание: ваша программа имеет различные опечатки, но я полагаю, что это не главное в этом вопросе.

mpfr_tкак и любой другой тип массива, не может использоваться в качестве типа возвращаемого значения; см. № 1592.

Чтобы вернуть mpfr_t значение, следуйте соглашению, которое используют все функции MPFR, и возвращайте его через параметр функции.

В вашем коде есть другая ошибка: mpfr_get() должен вернуться int (согласно соглашению; фактически не нашел такую ​​функцию в документах MPFR), а не mpfr_tсм. выше.

Другие вопросы по тегам