2015-11-18 69 views
-1

我想學習如何在c中使用GNU GMP庫,我編寫了這個程序,看看如何工作mpz_t mpq_numref(mpq_t N)mpz_t mpq_denref(mpq_t N)。我收到一個錯誤,真的不知道應該如何修改代碼才能使其正常工作。問:從類型'struct __mpz_struct *'分配類型'mpz_t'時不兼容的類型?

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <gmp.h> 

int main() 
{ 

    mpq_t u, v; 
    mpz_t a,b,c; 
    mpz_init(a); 
    mpz_init(b); 

    mpq_init(u); 
    mpq_init(v); 

    mpq_set_si(u, -6 ,2); 
    mpq_canonicalize(u); 
    a= mpq_numref(u); 
    b= mpq_denref(u); 
    gmp_printf("u =%Zd/%Zd\n", a,b); 

    return 0; 
} 

我得到的錯誤是:

error: incompatible types when assigning to type ‘mpz_t’ from type ‘struct __mpz_struct *’ 
     a= mpq_numref(u); 
     ^
7.c:21:8: error: incompatible types when assigning to type ‘mpz_t’ from type ‘struct __mpz_struct *’ 
     b= mpq_denref(u); 
     ^

非常感謝您的任何幫助的錯誤消息

+1

問題是'mpz_t'實際上是一個數組類型的typedef,所以你不能寫'a ='。你將不得不使用一個函數來完成這個任務。,.e.g [見這裏](https://gmplib.org/manual/Assigning-Integers.html) –

+0

謝謝你的幫助 – Kemo

回答

0

仔細閱讀將在這裏給你答案。 mpq_numrefmpq_denref函數都返回指向__mpz_struct類型的指針 - >struct __mpz_struct *

注意函數和數據類型的類型簽名,類型T與其相應的指針類型T *之間不存在隱式轉換。

0

感謝M.M的評論,代碼應該如此修改,它的工作原理。

#include <stdio.h> 
    #include <stdlib.h> 
    #include <math.h> 
    #include <gmp.h> 

    int main() 
    { 

     mpq_t u, v; 
     long int x,y,z; 
     mpz_t a,b,c; 
     mpz_init(a); 
     mpz_init(b); 

     mpq_init(u); 
     mpq_init(v); 

     mpq_set_si(u, -6 ,2); 
     mpq_canonicalize(u); 
     mpz_set(a, mpq_numref(u)); 
     mpz_set(b, mpq_denref(u)); 
     gmp_printf("u =%Zd/%Zd\n", a,b); 

     return 0; 
    } 
相關問題