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

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

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

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

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

×
如果是个结构体,那怎么这样改变变量的值呢:
  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, 2024-11-23 16:23 , Processed in 0.024875 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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