问题描述
这是作业的一部分,该作业与演员表无关,这是我自己尝试做的事情。
我在将int返回类型强制转换为除法函数中的float时遇到问题。尽管除法函数中的值正确,它仍然返回0。我已经阅读了很多有关int除法注意事项和四舍五入的文章,并且尝试了各种不同的解决方案,但无济于事。
我有一个可行的解决方案,可以仅从函数中进行打印,但是我试图在整个程序中保持一致并处理返回的值。
编辑(声明): 除函数具有返回类型int,因为我试图使其返回类型与其他具有返回类型int的其他计算器函数保持一致(在调度表中)。我正在尝试查看是否有可能通过强制转换从具有int返回类型的函数中返回分数浮点数。
以下是相关的截断代码以重现该问题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAXARGS 15
#define min(a,b) ((a) < (b) ? (a) : (b))
struct argList {
int count;
char *args[MAXARGS];
} argList;
//Division function
int divide(int c,struct argList l){
float a = (strtol(l.args[0],NULL,0));
float b = (strtol(l.args[1],0));
printf("\nIn Func = %f\n",a/b);
return (float)(a/b);
}
int main(int argc,char **argv) {
int argCount = min(argc-1,MAXARGS);
int i = 0;
for (i = 0,argv++; i<argCount; i++) {
argList.args[i] = malloc(strlen(argv[i]+1));
strncpy(argList.args[i],argv[i],strlen(argv[i])+1);
}
argList.count = i;
printf("Out of Func = %f\n",(float)divide(argList.count,argList));
return 0;
}
样本输出:
./main 2 5
In Func = 0.400000
Out of Func = 0.000000
./main 10 5
In Func = 2.000000
Out of Func = 2.000000
第二个输入有效的事实使我相信它仍然是经常提到的整数除法/舍入问题。但是我认为函数调用和返回类型的转换可以避免该问题。
让我知道是否有人有解决此问题的想法。
编辑:尝试的解决方案:
使用strtof
和strtod
而不是强制转换为strol
,投射一个操作数,同时转换两个操作数,创建一个单独的变量,乘以100.0f。
解决方法
至少这些问题:
代码正在查找某些参数的长度。由于分配的内存不足,此错误稍后会在以后的代码中导致不确定的行为(UB)。
// argList.args[i] = malloc(strlen(argv[i]+1));
argList.args[i] = malloc(strlen(argv[i]) + 1);
为什么要转换为整数,然后转换为float
?转到float
。
// float a = (strtol(l.args[0],NULL,0));
float a = strtod(l.args[0],NULL);
// or better
float a = strtof(l.args[0],NULL);
,
如果将浮点数转换为int然后转换为浮点数。您可能永远都不会得到原始的浮动。
您需要的是获取内存中存在的内容并将其视为整数。要执行这种操作,您可以使用并集:
例如,您添加:
typedef union {
float f;
int i;
} IF_t;
在除法功能中,您将打印和退货替换为:
IF_t r;
r.f = a/b;
printf("\nIn Func = %f\n",r.f);
return r.i;
,您将main中的printf替换为:
res.i = divide(argList.count,argList);
printf("Out of Func = %f\n",res.f);
当然您在主体中声明了IF_t res;
。