hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 473|回复: 7

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

[复制链接]

585

主题

769

帖子

2007

积分

大司空

Rank: 5Rank: 5

积分
2007
发表于 2024-3-15 08:52:13 | 显示全部楼层 |阅读模式
如果是个结构体,那怎么这样改变变量的值呢:
  1. mpz_t a,b,c;mpz_add(a,b,c);
复制代码
此时a就等于b+c了

可如果mpz_t声明的是指针,那它的空间是什么时候分配的呢?
回复

使用道具 举报

0

主题

183

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-15 08:52:31 | 显示全部楼层
指针。 mpz_init初始化
回复

使用道具 举报

0

主题

173

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-15 08:52:36 | 显示全部楼层
可是mpz_init(a);的参数也是mpz_t型的,这样的话mpz_init()得到的就是一个指针的副本,它如何做到使原指针指向自己开辟的空间呢?
比如下面的代码是会出错的
  1. #include <stdio.h>#include <stdlib.h>void f(int *x){    x=(int *)malloc(sizeof(int));}int main(){    int *a;    f(a);    *a=3;    printf("%d",*a);    return 0;}
复制代码
回复

使用道具 举报

0

主题

212

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-15 08:53:30 | 显示全部楼层
有几种不同的做法,可以通过宏来做到
回复

使用道具 举报

0

主题

192

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-15 08:54:24 | 显示全部楼层
感谢mathe的解答
回复

使用道具 举报

0

主题

201

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-15 08:54:46 | 显示全部楼层
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提供的这些函数都已经很充分了。
回复

使用道具 举报

0

主题

166

帖子

33

积分

新手上路

Rank: 1

积分
33
发表于 2024-3-15 08:55:39 | 显示全部楼层
回wayne兄...
没想自己弄,只是用着用着对mpz_t的性质起了疑心,翻代码没翻出头绪就来请教了
回复

使用道具 举报

0

主题

203

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-3-15 08:56:18 | 显示全部楼层
7# 没——问题
从gmp.h的代码片段
  1. #ifdef __GMP_SHORT_LIMBtypedef unsigned int                mp_limb_t;typedef int                        mp_limb_signed_t;#else#ifdef _LONG_LONG_LIMBtypedef unsigned long long int        mp_limb_t;typedef long long int                mp_limb_signed_t;#elsetypedef unsigned long int        mp_limb_t;typedef long int                mp_limb_signed_t;#endif#endiftypedef unsigned long int        mp_bitcnt_t;/* For reference, note that the name __mpz_struct gets into C++ mangled   function names, which means although the "__" suggests an internal, we   must leave this name for binary compatibility.  */typedef struct{  int _mp_alloc;                /* Number of *limbs* allocated and pointed                                   to by the _mp_d field.  */  int _mp_size;                        /* abs(_mp_size) is the number of limbs the                                   last field points to.  If _mp_size is                                   negative this is a negative number.  */  mp_limb_t *_mp_d;                /* Pointer to the limbs.  */} __mpz_struct;#endif /* __GNU_MP__ */typedef __mpz_struct MP_INT;    /* gmp 1 source compatibility */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为有理大数模块。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-12-5 03:06 , Processed in 0.071495 second(s), 21 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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