我使用GMP 5.0.2库中的类型和函数编写了Fibonacci函数。但是在编译时我一直都会遇到错误。以下是错误和代码:
main.c:4:7: error: ‘fib’ declared as function returning an array
main.c: In function ‘main’:
main.c:21:10: error: incompatible types when assigning to type ‘mpz_t’ from type ‘int’
main.c: At top level:
main.c:32:7: error: ‘fib’ declared as function returning an array
main.c: In function ‘fib’:
main.c:33:28: warning: return makes integer from pointer without a cast [enabled by default]
main.c:44:3: warning: passing argument 2 of ‘__gmpz_set’ makes pointer from integer without a cast [enabled by default]
/usr/local/include/gmp.h:1074:21: note: expected ‘mpz_srcptr’ but argument is of type ‘int’
main.c:45:3: warning: passing argument 2 of ‘__gmpz_set’ makes pointer from integer without a cast [enabled by default]
/usr/local/include/gmp.h:1074:21: note: expected ‘mpz_srcptr’ but argument is of type ‘int’
main.c:47:3: error: too few arguments to function ‘__gmpz_add’
/usr/local/include/gmp.h:696:21: note: declared here
,代码是
#include <stdio.h>
#include <gmp.h>
mpz_t fib (mpz_t, const mpz_t);
int main (void) {
printf("Before anything\n"); // debugging
mpz_t FOUR; mpz_init(FOUR); mpz_add_ui(FOUR, FOUR, 4);
printf("Declare FOUR, initilize it, set it to 4\n"); // debugging
mpz_t N; mpz_init(N); mpz_add_ui(N, N, 5);
printf("Declare N, initilize it, set it to 5\n"); // debugging
mpz_t fibFive; mpz_init(fibFive);
printf("Declare fibFive, initilize it\n"); // debugging
fibFive = fib(N, FOUR);
printf("After calling the fib function on fibFive\n"); // debugging
gmp_printf("5th fibonacci number is %Zd\n", fibFive);
printf("the end\n"); // debugging
return 0;
}
mpz_t fib (mpz_t n, const mpz_t baseCase) {
if (mpz(n, baseCase) < 0) return n;
else {
mpz_t a, b;
mpz_t t1, t2;
mpz_init(a); mpz_init(b);
mpz_init(t1); mpz_init(t2);
mpz_sub_ui(t1, n, 2);
mpz_sub_ui(t2, n, 1);
mpz_set(a, fib(t1, baseCase));
mpz_set(b, fib(t2, baseCase));
return mpz_add(a, b);
}
}
对于我使用gcc main.c -lgmp
注意:我阅读了GMP手册,并使用了整数函数手册GMP 5.0.2 Manual - Integer Functions
代码中的函数。答案 0 :(得分:2)
gmp.h
的相关部分(我不知道我已安装的次要版本,但GMP 4中的版本相同,我认为不会很快更改)
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
是一个包含__mpz_struct
的长度为1的数组。这就是
main.c:4:7:错误:'fib'声明为返回数组的函数
等。没有原型,编译器显然假定为隐式int,因此
fibFive = fib(N, FOUR);
原因
main.c:21:10:错误:从类型'int'分配类型'mpz_t'时出现不兼容的类型
要解决此问题,您必须将mpz_t
作为输出参数传递给您的函数,只需进行最少的更改(而不是您的索引关闭,传统上为F(0) = 0
):
#include <stdio.h>
#include <gmp.h>
void fib (mpz_t, mpz_t, const mpz_t);
int main (void) {
printf("Before anything\n"); // debugging
mpz_t FOUR; mpz_init(FOUR); mpz_add_ui(FOUR, FOUR, 4);
printf("Declare FOUR, initilize it, set it to 4\n"); // debugging
mpz_t N; mpz_init(N); mpz_add_ui(N, N, 5);
printf("Declare N, initilize it, set it to 5\n"); // debugging
mpz_t fibFive; mpz_init(fibFive);
printf("Declare fibFive, initilize it\n"); // debugging
fib(fibFive, N, FOUR);
printf("After calling the fib function on fibFive\n"); // debugging
gmp_printf("5th fibonacci number is %Zd\n", fibFive);
printf("the end\n"); // debugging
return 0;
}
void fib (mpz_t res, mpz_t n, const mpz_t baseCase) {
if (mpz_cmp(n, baseCase) < 0){
mpz_set(res,n);
} else {
mpz_t a, b;
mpz_t t1, t2;
mpz_init(a); mpz_init(b);
mpz_init(t1); mpz_init(t2);
mpz_sub_ui(t1, n, 2);
mpz_sub_ui(t2, n, 1);
fib(a, t1, baseCase);
fib(b, t2, baseCase);
mpz_add(res, a, b);
}
}