2010-06-06 2 views
2

Пока я использую заголовочный файл gmp.h. Мне нужна функция, которая принимает входные данные типа mpz_t и возвращает тип mpz_t. Я очень новичок использования gmp.h Итак, вот щелкает следующее мою приближенную коду ...тип возвращаемого значения при использовании файла заголовка GMP.h

mpz_t sum_upto(mpz_t max) 
{  
    mpz_t sum; 
    mpz_init(sum);  
    mpz_init(result); 
    for(int i=0;i<=max-1;i++)  
     mpz_add_ui(sum,sum,pow(2,i)); 
    return sum; 
} 

, но он будет показывать ошибку:

  1. пау был не используется в .. это сфера ", хотя я добавил math.h в самом начале файла
  2. sum_upto объявлена ​​как функция возвращающая массив ...
+0

Что такое 'mpz_t'? Является ли это typedef для массива? Если да, то вы не можете вернуть 'mpz_t'. –

ответ

0

Попробуйте следующее:

mpz_t sum_upto(mpz_t max) 
{ 
    mpz_t sum; 
    mpz_init(sum); 
    mpz_init(result); 
    int val = 1; 
    for(int i=0;i<=max-1;i++) { 
     mpz_add_ui(sum,sum,val); 
     val *= 2; //compiler should make a shift operation out of it 
    } 
    return sum; 
} 

Кроме того, вы можете удалить заголовок math.h.

7

Соглашение о функциях с использованием GMP можно найти в manual. По сути, вы должны следовать тем же соглашениям, которые сам GMP делает - функция должна иметь тип возврата void, и вы должны указать значение, в которое следует поместить результат в качестве параметра.

Вот пример, приведенный:

void foo (mpz_t result, const mpz_t param, unsigned long n) 
{ 
    unsigned long i; 
    mpz_mul_ui (result, param, n); 
    for (i = 1; i < n; i++) 
    mpz_add_ui (result, result, i*7); 
} 

int main (void) 
{ 
    mpz_t r, n; 
    mpz_init (r); 
    mpz_init_set_str (n, "123456", 0); 
    foo (r, n, 20L); 
    gmp_printf ("%Zd\n", r); 
    return 0; 
} 
+0

Это правильно. – CLearner

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