【问题标题】:Error: More than one instance of overloaded function "sqrt" matches the argument list. What that?错误:多个重载函数“sqrt”实例与参数列表匹配。那是什么?
【发布时间】:2016-11-01 15:42:41
【问题描述】:

在我的 C 课作业中,我们必须编写一个程序来检查整数是否为素数。我在 sqrt() 函数中遇到错误。我的教授告诉我 num 必须是整数,我们必须使用 sqrt() 函数。我认为问题在于 sqrt() 函数不能用于整数,但我的教授告诉我它可以,而且我从其他东西那里得到了一个错误。你们看到问题了吗?

int primality(int num)
{

int isprime;

    /*check if num is prime*/
    for (int i = 2; i <= sqrt(num); i++)
    {
        if (num % i == 0)
            isprime = 0; /*is not prime*/
        else 
            isprime = 1; /*is prime*/
    }

    if (isprime == 0)
        return 0;
    elseif (isprime == 1)
        return 1;
}

编辑: 是的,我正在使用 math.h 并编译为 C 代码。

错误消息是“错误:多个重载函数“sqrt”实例与参数列表匹配。

【问题讨论】:

  • 你得到的错误信息是......?在没有看到的情况下,(a)您是否包含了 math.h? (b) 你是否与 libm 链接? (我忽略了程序中的任何其他错误,@CarlNorum 指出了一个)
  • 在这段代码中,您将从循环的每次迭代中返回。换句话说,您只会进行一次迭代。此代码仅测试您的数字是偶数还是奇数。顺便说一句,更正后的函数应该命名为isprime。你不能使用bool 而不是int 作为逻辑值吗?
  • 你是怎么编译的?我在错误消息中闻到了C++
  • 我正在使用 Visual C++ 编写和编译我的代码。这可能是问题吗?我以前从未遇到过任何问题。
  • 可以将i &lt;= sqrt(num)改写为i * i &lt;= num

标签: c math


【解决方案1】:

C 语言没有“重载”。我敢打赌,您将代码编译为 C++,而不是 C。如果您使用 GCC,请使用 gcc 编译,而不是 g++。如果您使用的是 Visual Studio,项目的属性中有一个选项:

  1. 右键单击您的项目
  2. 点击属性
  3. 点击 C/C++
  4. 点击高级
  5. 将属性“编译为”设置为 C 代码 (/TC)

在任何一种情况下,使用.c 扩展名(小写“c”)命名您的文件。

确实,C语言中只有一个sqrt,定义为

double sqrt(double);

并且整数转换为双精度。

【讨论】:

  • 我正在使用 Visual C++ 并且文件以 .c 扩展名命名。不过,我将查看 Compile as C Code 选项的设置。
  • @Petefic:我已经遇到了这个问题。 VC++ 似乎并不关心你的文件是什么扩展名,而且看起来你真的在这里编译成 C++ 代码。
  • cmath 中没有 sqrt(int,...),因此您必须像 sqrt((double)num) 一样将整数转换为 double 以匹配 sqrt() 定义之一。此外,您正在使用 C++,因为您直接在 for loop 头部部分中声明并初始化了 int i = 2。 :)
  • @ludesign:不,for 循环使用是标准 C。
  • @R.. 是 C99 中的标准,从 C++ 采用;但在 C89 (ANSI) 中并非如此。无论如何,我的立场是正确的。 :)
【解决方案2】:

您不想在循环中使用return 1 - 它需要在循环完成之后。你的教授是对的,sqrt(num) 可以工作 - num 将自动提升为 double - C 有函数调用中类型更改的规则等。如果你还没有这样做,你确实需要包含 math.h您程序的其他地方 - 您遇到了什么错误?

【讨论】:

  • 还有一个问题——你实际上想要
  • @derobert:我看不出这里有任何不精确的问题需要处理......如果x 是一个不超过 53 位的完美正方形,sqrt(x) 有一个精确的结果,并且 IEEE 754 要求返回确切的结果。
  • @R..:即使假设 IEEE 754,int 也可以是 64 位。
  • 确实,这就是我提到条件的原因。
【解决方案3】:

你的逻辑在这里是错误的:

    if (num % i == 0)
        return 0; /*is not prime*/
    else 
        return 1; /*is prime*/

如果你想一想,如果这个数字不能被二整除,你的函数会立即返回1

returning 太早了。请记住,return 实质上会停止您的功能并中断它。

相反,尝试在数字是合数时打破,并在您确定它是素数时返回True

顺便说一句,您的函数会将素数平方(即92549)注册为素数,因为您在&lt; 循环中使用了&lt; 符号。

将其更改为 &lt;= 符号,因为这将说明平方根是该数字的唯一除数。

【讨论】:

  • 嗯,大部分功课都完成了,因为你还没有处理不精确的 FP。据我们所知,(int)(sqrt(100)) == 9 可能是真的。
  • 对不起,这是自动反应。
【解决方案4】:

#include &lt;math.h&gt;了吗?

此外,根据您的功能 1、2 和 3 以非质数返回...可能想要解决这个问题。我会提供更多帮助,但听起来这是为了做作业,我宁愿不只是给你答案(有些大学认为这是作弊)。

【讨论】:

  • 由于您没有发布您遇到的错误,这只是我想到的第一个错误(即使在我自己的代码中,我也会时不时忘记包含)。
  • 如果使用 num 作为 int 的 sqrt(num) 出现错误,您可以尝试将其转换为浮点数。
【解决方案5】:

回答您的实际问题:sqrt() 对 int 没有重载,但对 double 和 float 都有重载,因此编译器无法猜测使用哪一个。

【讨论】:

    【解决方案6】:

    问题是 sqrt 函数不接受整数作为参数。你会想做的

    sqrt((double)n) 或 sqrt((float)n) 来修复它。

    【讨论】:

      【解决方案7】:

      如果包含#include &lt;math.h&gt;,则可以通过将sqrt(num) 更改为简单的声明变量(如n, x, i...)来修复for (int i = 2; i &lt;= sqrt(num); i++) 的错误,因为sqrt(num) 已在math.h 库中使用。

      【讨论】:

        【解决方案8】:

        sqrt() 的函数定义为double sqrt(double),所以你的输入应该是双精度或浮点数。

        要将integer 变量转换为float 而不更改类型,请使用float( integer_Variable )

        例如在你的代码中写i&lt;=sqrt(float(num));

        【讨论】:

        • 请修正您的评论,将代码放入代码标签等。
        猜你喜欢
        • 1970-01-01
        • 2023-03-20
        • 2012-10-12
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-26
        相关资源
        最近更新 更多