2015-11-18 111 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; 
    } 
相关问题