Например, я хотел бы сделать что-то вроде этого:
#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, который преобразовал простой синтаксис с использованием +, -, /, * и т. Д. В код C, реализующий данные выражения с использованием GMP, то, кажется, это было бы намного сложнее, поскольку я придется отслеживать все промежуточные значения.
Итак, как я могу заставить GMP подчиниться моей воле и принять более разумный синтаксис? Могу ли я безопасно "обмануть" и привести mpz_t к пустоте *, а затем восстановить его на другом конце обратно в mpz_t? Читая документацию, я предполагаю, что это не на самом деле , проходящий вокруг массива, а просто ссылка, так почему же он не может также вернуть ссылку? Есть ли какая-то хорошая основа звукового программирования для такой работы, которую я должен рассмотреть при написании своей собственной программы?