数学研发论坛

 找回密码
 欢迎注册
查看: 5985|回复: 7

[求助] gmp中mpz_t是指针?结构体?或者是其它什么东西?

[复制链接]
发表于 2010-8-22 16:52:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

x
如果是个结构体,那怎么这样改变变量的值呢:
  1. mpz_t a,b,c;
  2. mpz_add(a,b,c);
复制代码
此时a就等于b+c了

可如果mpz_t声明的是指针,那它的空间是什么时候分配的呢?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-22 18:48:20 | 显示全部楼层
指针。 mpz_init初始化
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-22 19:08:16 | 显示全部楼层
可是mpz_init(a);的参数也是mpz_t型的,这样的话mpz_init()得到的就是一个指针的副本,它如何做到使原指针指向自己开辟的空间呢?
比如下面的代码是会出错的
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void f(int *x)
  4. {
  5.     x=(int *)malloc(sizeof(int));
  6. }
  7. int main()
  8. {
  9.     int *a;
  10.     f(a);
  11.     *a=3;
  12.     printf("%d",*a);
  13.     return 0;
  14. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-22 20:18:49 | 显示全部楼层
有几种不同的做法,可以通过宏来做到
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-22 20:52:59 | 显示全部楼层
感谢mathe的解答
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-8-23 12:41:38 | 显示全部楼层
5# 没——问题
请教一个问题,自己分配空间自己再free 有什么好处吗。

==================================================
GMP里面有一大堆的 初始化,赋值的函数可以用的,如 mpz_init,mpz_inits,
甚至,初始化和赋值合二为一,一个函数就能搞定的,比如:
mpz_init_set ,mpz_init_set_ui,mpz_init_set_si,mpz_init_set_d,mpz_init_set_str

我感觉GMP提供的这些函数都已经很充分了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2010-8-23 14:20:45 | 显示全部楼层
回wayne兄...
没想自己弄,只是用着用着对mpz_t的性质起了疑心,翻代码没翻出头绪就来请教了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-2-24 16:37:47 | 显示全部楼层
7# 没——问题
从gmp.h的代码片段
  1. #ifdef __GMP_SHORT_LIMB
  2. typedef unsigned int                mp_limb_t;
  3. typedef int                        mp_limb_signed_t;
  4. #else
  5. #ifdef _LONG_LONG_LIMB
  6. typedef unsigned long long int        mp_limb_t;
  7. typedef long long int                mp_limb_signed_t;
  8. #else
  9. typedef unsigned long int        mp_limb_t;
  10. typedef long int                mp_limb_signed_t;
  11. #endif
  12. #endif
  13. typedef unsigned long int        mp_bitcnt_t;

  14. /* For reference, note that the name __mpz_struct gets into C++ mangled
  15.    function names, which means although the "__" suggests an internal, we
  16.    must leave this name for binary compatibility.  */
  17. typedef struct
  18. {
  19.   int _mp_alloc;                /* Number of *limbs* allocated and pointed
  20.                                    to by the _mp_d field.  */
  21.   int _mp_size;                        /* abs(_mp_size) is the number of limbs the
  22.                                    last field points to.  If _mp_size is
  23.                                    negative this is a negative number.  */
  24.   mp_limb_t *_mp_d;                /* Pointer to the limbs.  */
  25. } __mpz_struct;

  26. #endif /* __GNU_MP__ */


  27. typedef __mpz_struct MP_INT;    /* gmp 1 source compatibility */
  28. typedef __mpz_struct mpz_t[1];
复制代码
可以看出定义:  mpz_t a,b,c;
就是定义结构体类型的指针变量。
内存管理通过三个函数malloc(), realloc(),free()  
__mpz_struct结构体中,_mp_d为数据块指针,_mp_alloc为分配的数据块大小,_mp_size为实际有效数据大小和正负空信息。
init(); 根据_mp_alloc大小(初始化为1)通过malloc()分配空间,并赋块指针给_mp_d,并置_mp_size=0

mpn为通用模块(给mpz,mpf,mpq调用),mpz为整形大数模块,mpf为浮点大数模块,mpq为有理大数模块。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2019-6-25 10:01 , Processed in 0.055083 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表