使用 GMP.h 头文件时的返回类型

发布于 2024-09-04 02:34:56 字数 427 浏览 8 评论 0原文

当我使用 gmp.h 头文件时。我需要一个函数,它接受 mpz_t 类型的输入并返回 mpz_t 类型。 我是使用 gmp.h 的初学者 所以,这是我所接近的代码的快照...

mpz_t sum_upto(mpz_t max)  
{    
    mpz_t sum;  
    mpz_init(sum);    
    mpz_init(result);  
    for(int i=0;i<=max-1;i++)    
        mpz_add_ui(sum,sum,pow(2,i));   
    return sum;   
}

但它会显示错误:

  1. pow 在此范围内未使用。”,尽管我在文件的最开头添加了 math.h。
  2. sum_upto 声明为函数返回一个数组...

While I'm using gmp.h header file. I need a function which takes inputs of type mpz_t and return mpz_t type too.
I'm very beginner of using gmp.h
So, Here is snaps follows of my approached code...

mpz_t sum_upto(mpz_t max)  
{    
    mpz_t sum;  
    mpz_init(sum);    
    mpz_init(result);  
    for(int i=0;i<=max-1;i++)    
        mpz_add_ui(sum,sum,pow(2,i));   
    return sum;   
}

but it will show error:

  1. pow has been not used in this scope.", although I have added math.h at the very beginning of the file.
  2. sum_upto declared as function returning an array...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

廻憶裏菂餘溫 2024-09-11 02:34:56

使用 GMP 的函数约定可以在手册中找到。本质上,您必须遵循与 GMP 本身相同的约定 - 函数必须具有 void 返回类型,并且您必须提供一个值以将结果作为参数放入其中。

这是给出的示例:

 void foo (mpz_t result, const mpz_t param, unsigned long n)
 {
   unsigned long  i;
   mpz_mul_ui (result, param, n);
   for (i = 1; i < n; i++)
     mpz_add_ui (result, result, i*7);
 }

 int main (void)
 {
   mpz_t  r, n;
   mpz_init (r);
   mpz_init_set_str (n, "123456", 0);
   foo (r, n, 20L);
   gmp_printf ("%Zd\n", r);
   return 0;
 }

The convention for functions using GMP can be found in the manual. Essentially, you must follow the same conventions that GMP itself does - the function must have a void return type, and you must provide a value into which to put the result as a parameter.

Here is the example given:

 void foo (mpz_t result, const mpz_t param, unsigned long n)
 {
   unsigned long  i;
   mpz_mul_ui (result, param, n);
   for (i = 1; i < n; i++)
     mpz_add_ui (result, result, i*7);
 }

 int main (void)
 {
   mpz_t  r, n;
   mpz_init (r);
   mpz_init_set_str (n, "123456", 0);
   foo (r, n, 20L);
   gmp_printf ("%Zd\n", r);
   return 0;
 }
暮年慕年 2024-09-11 02:34:56

请尝试以下操作:

mpz_t sum_upto(mpz_t max)
{
    mpz_t sum;
    mpz_init(sum);
    mpz_init(result);
    int val = 1;
    for(int i=0;i<=max-1;i++) {
        mpz_add_ui(sum,sum,val);
        val *= 2; //compiler should make a shift operation out of it
    }
    return sum;
}

此外,您可以删除 math.h 标头。

Try the following:

mpz_t sum_upto(mpz_t max)
{
    mpz_t sum;
    mpz_init(sum);
    mpz_init(result);
    int val = 1;
    for(int i=0;i<=max-1;i++) {
        mpz_add_ui(sum,sum,val);
        val *= 2; //compiler should make a shift operation out of it
    }
    return sum;
}

Furthermore you can possibly drop the math.h header.

返回 mpz_t 不会返回对象,只返回一个指针,这几乎肯定不是我们想要的。

下面是一个接受 mpz_t 参数、进行计算并将结果存储到指定参数的示例。

#include <stdio.h>
#include <gmp.h>

mpz_t *sum_upto(mpz_t *sum, int max) {
    mpz_t nval;
    mpz_init(nval);

    for (int i = 0; i < max; i++) {
        mpz_ui_pow_ui(nval, 2, i); /* nval = pow(2, i) */
        mpz_add(*sum, *sum, nval); /* sum = sum + nval */
    }

    return sum;
}

int main() {

    mpz_t sum;
    mpz_init_set_ui(sum, 0);

    gmp_printf("%Zd\n", sum_upto(&sum, 1000));
    mpz_clear(sum);

    return 0;
}

A return of an mpz_t doesn't return the object, only a pointer, and this is almost certainly not what's wanted.

Here's an example accepting an mpz_t parameter, doing a calculation, and storing the result to the indicated parameter.

#include <stdio.h>
#include <gmp.h>

mpz_t *sum_upto(mpz_t *sum, int max) {
    mpz_t nval;
    mpz_init(nval);

    for (int i = 0; i < max; i++) {
        mpz_ui_pow_ui(nval, 2, i); /* nval = pow(2, i) */
        mpz_add(*sum, *sum, nval); /* sum = sum + nval */
    }

    return sum;
}

int main() {

    mpz_t sum;
    mpz_init_set_ui(sum, 0);

    gmp_printf("%Zd\n", sum_upto(&sum, 1000));
    mpz_clear(sum);

    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文