首页 > 解决方案 > 在c中取消引用指针时遇到问题

问题描述

我的体育运动更好一些,我发现自己从许多体育博彩中常见的赔率赔率中手动计算小数赔率。我正在尝试编写一个程序,该程序至少可以消除一遍又一遍地计算的负担。

我的程序是一个将输入“team-one moneyline-teamone team-two moneyline-teamtwo”并输出带有小数赔率的团队名称的程序,如下所示:

输入:公羊 +230 Bucs -280

我尝试过处理取消引用的所有排列,但似乎无法阻止它给出分段错误。

#include <stdio.h>
#include <stdlib.h>

void calcML(int a, float *b, float *c);

int main (int argc, char* argv[])
{
        int oneML, twoML;
        float oneDF, oneDA, twoDF, twoDA;

        oneML = atoi(argv[2]);
        twoML = atoi(argv[4]);

        printf("Team one is %s with a ML of %i.\nTeam two is %s with a moneyline of %i.\n", argv[1], oneML, argv[3], twoML);

        calcML(oneML, &oneDF, &oneDA);
        calcML(twoML, &twoDF, &twoDA);

        printf("%s %f %f\n", argv[1], oneDF, twoDA);
        printf("%s %f %f\n", argv[3], twoDF, oneDA);
}

void calcML (int a, float *b, float *c)
{
        if (a < 0){
          int tmp = -a;
          *b = 1 + tmp/100;
          *c = 100/tmp;
        }
        else {
          *b = 1 + a/100;
          *c = 100/a;
        }
}

如上所述,我希望输出为:

Team one is Rams with a ML of +230.
Team two is Bucs with a ML of -280.
Rams  3.30 3.80
Bucs  1.36 1.43

现在的输出是:

Team one is Rams with a ML of +230.
Team two is Bucs with a ML of -280.
Segmentation fault

就像我说的,我知道这是一个指针算术问题,但我尝试了一百万种不同的排列,但无法弄清楚。感谢任何不介意指出我愚蠢错误的善良灵魂!

标签: cpointers

解决方案


我无法重现段错误,但正如其他人提到的那样,您似乎不小心截断了任何浮点值。在calcML,当您执行时1 + tmp/100;,编译器通过强制tmp转换为整数来“帮助您”。这是clang 10.0.1在 MacBook 上使用的。我想改变1to1.0100to100.0将有助于澄清一些数学问题。据我所知,您的指示至少看起来都是正确的。


推荐阅读