gpt4 book ai didi

c - 如何将 GMP C 参数约定转换为更自然的东西?

转载 作者:行者123 更新时间:2023-12-04 05:52:24 24 4
gpt4 key购买 nike

例如,我想做这样的事情:

#include <gmp.h>
typedef mpz_t Integer;

//
Integer F(Integer a,Integer b,Integer c,Integer d) {
Integer ret = times(plus(a,b),plus(c,d));
}

但是,GMP 不允许我这样做,显然 mpz_t 是一个数组,所以我收到错误消息:
error: ‘F’ declared as function returning an array

所以相反,我将不得不做这样的事情:
void F(Integer ret,Integer a,Integer b,Integer c,Integer d) {
Integer tmp1,tmp2;

plus(tmp1,a,b);
plus(tmp2,c,d);
times(ret,tmp1,tmp2);
}

这是不自然的,并且不遵循可以组合 C(或一般数学)表达式的逻辑方式。实际上,您无法以类似数学的方式编写任何内容,因为显然您无法返回 GMP 数字!例如,如果我想编写一个简单的 yacc/bison 样式解析器,该解析器将使用 +、-、/、* 等的简单语法转换为使用 GMP 实现给定表达式的 C 代码,这似乎要困难得多,因为我必须跟踪所有中间值。

那么,我如何才能强制 GMP 屈服于我的意愿并接受更合理的语法?我可以安全地“作弊”并将 mpz_t 转换为 void *,然后在另一端将其重新组合回 mpz_t 吗?我从阅读文档中假设它并没有真正传递数组,而只是一个引用,那么为什么它也不能返回一个引用呢?这样做是否有一些良好的编程基础,我应该在编写自己的程序时考虑这样做?

最佳答案

来自 gmp.h:

typedef __mpz_struct mpz_t[1];

这很有意义,而且很自然。想一想:有一个
大小为 1 的数组允许您处理被遮挡的指针(称为不透明指针)
引用)及其所有优点:
mpz_t number;
DoubleIt(number); /* DoubleIt() operates on `number' (modifies it) as
it will be passed as a pointer to the real data */

如果它不是数组,则必须执行以下操作:
mpz_t number;
DoubleIt(&number);

然后所有的困惑都来了。不透明类型背后的意图是
隐藏这些,所以你不必担心。和主要的之一
关注点应该很清楚:大小(这会导致性能)。当然你
不能返回这样的结构,它保存的数据仅限于可用内存。什么
关于这个(将 mpz_t 视为“一流”类型):
mpz_t number = ...;
number = DoubleIt(number);

您(程序)必须复制 number 中的所有数据。并将其作为
函数的参数。那么就需要留出合适的空间
返回另一个更大的数字。

结论:因为您必须间接(使用指针)处理数据,所以它是
最好使用不透明类型。您将只传递对您的引用
函数,但您可以对它们进行操作,就好像整个概念是
引用传递(C 默认为引用传递)。

关于c - 如何将 GMP C 参数约定转换为更自然的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9916401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com