除法问题:将 int return 类型转换为 float,returning 0

Issues with division: casting an int return type to float, returning 0

这是作业的一部分,作业与选角无关,这是我自己想做的事情。

我在将除法函数中的 int return 类型转换为 float 时遇到问题。它保持 returning 0,尽管在除法函数中有正确的值。我已经阅读了很多关于 int 除法注意事项和四舍五入的不同帖子,并且我尝试实施各种不同的解决方案都无济于事。

我有一个仅从函数内部打印的可行解决方案,但我试图在整个程序中保持一致并处理 returned 值。

编辑(清晰度): 除法函数有一个 return 类型的 int 因为我试图保持它的 return类型与具有 return 类型 int 的一堆其他计算器函数一致(在调度 table 中)。我正在尝试查看是否有可能通过转换从具有 int return 类型的函数 return 小数浮点数。

这里是重现问题的相关截断代码:

#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], NULL, 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

第二个输入有效的事实让我相信它仍然是经常提到的整数 division/rounding 的问题。但我认为通过函数调用和 return 类型的转换可以避免该问题。

如果有人有任何解决此问题的想法,请告诉我。

编辑:尝试的解决方案:

转换一个操作数,转换两个操作数,创建一个单独的变量,乘以 100.0f,使用 strtofstrtod 而不是转换为 strol.

至少这些问题:

代码正在寻找一些参数的长度。由于分配的内存不足,此错误随后会在以后的代码中导致 未定义的行为 (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;

在 divide 函数中,您将 print 和 return 替换为:

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;