C++ 传递一个 int,错误地说这是一个双精度

C++ Passing An Int, Error Saying It's A Double

本文关键字:一个 双精度 C++ int 错误      更新时间:2023-10-16

我目前正在进行一项任务,我们正在使用c++制作一个汇编程序。当输入数字时,我已经让代码进行了区分,并试图让程序将16位数组中的相关位更改为所需的二进制数。

问题是,在计算幂之后,输入数的余数和超过它的第一次幂被分配给int,但将其传递回dec_to_bin(),我得到了以下错误。

assembly.cpp:在函数"void dec_to_bin(int,int*)"中:汇编器.cpp:135:32:错误:从"double(*)(double,double)throw()"到"int"的转换无效[-fpermission]dec_to_bin(余数,指针);

//*pointer points to an array[16]
void dec_to_bin(int num, int *pointer)
{
    //Base cases
    if(num == 2)
    {
        pointer[14] = 1;
        return;
    }
    else if(num == 1)
    {
        pointer[15] = 1;
        return;
    }
    else
    {
        int power = 0;
        //power function outlined below. The inbuilt pow(a, b) returns a
        //double and gave the same problem, so I tried this instead.
        while(PowerFunc(2, power) < num)
        {
            power++;
        }
        //Problem arises here. remainder is assigned as an int
        //Using typeinfo shows it as an int, yet passing it a few lines
        //down gives the quoted error.
        int remainder = PowerFunc(2, power)-num;
        pointer[16-power] = 1;
    }
    if(remainder == 0)
    {
        return;
    }
    else
    {
        //Line that throws the error. Saying remainder is a double.
        dec_to_bin(remainder, pointer);
    }
}
//Power function to replace pow(a, b). Not ideal but it works.
int PowerFunc(int number, int powernum)
{
    if(powernum == 0)
    {
        return 1;
    }
    else if(powernum == 1)
    {
        return number;
    }
    else
    {
        return number * PowerFunc(number, powernum-1);
    }
}

老实说,这让我很为难。起初,我认为使用pow(a,b)并将其分配给int只会拼接掉小数部分,但即使制作自己的幂函数,也仍然告诉我我的int是双精度的。

    int remainder = PowerFunc(2, power)-num;

出现在else下由大括号分隔的块之间,因此remainder变量的范围仅向下延伸一行。中的remainder

    if(remainder == 0)

    dec_to_bin(remainder, pointer);

是另一个实体,巧合的是具有相同的名称。你可以通过将你的remainder重命名为其他任何东西来验证,比如myremainder。。。

其他注意事项:
考虑用if(powernum <= 0)替换if(powernum == 0)——这将在负指数的情况下节省大量计算。

我还建议替换递归

return number * PowerFunc(number, powernum-1);

带迭代:

int result = 1;
while(powernum-- >= 0)
    result *= number;
return result;

很容易,remainder也是在其他地方声明的函数,编译器抱怨dec_to_bindouble作为其第一个参数,而不是指向double (*)(double, double)类型函数的指针。

在调用dec_to_bin(remainder, pointer);时,在else作用域中声明的变量remainder不可见。

您的if(remainder == 0)也有问题,因为它的计算结果总是为false。

相关文章: